ImportError: No module named google.protobuf

ImportError: No module named google.protobuf

我正在关注 this guide 并使用 addressbook.proto 的确切示例。

Post 编译器生成的 addressbook_pb2.py 文件的内容。 当我 运行 下面的简单程序时,出现错误提示,无法找到 google.protobuf,请问如何解决这个问题?谢谢。

顺便说一句,在 Mac OSX.

上使用 Python 2.7
from addressbook_pb2 import Person

p = Person()
p.email = "abc"

print p.email

这里是自动生成的文件addressbook_pb2.py,

# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: addressbook.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor.FileDescriptor(
  name='addressbook.proto',
  package='tutorial',
  syntax='proto2',
  serialized_pb=_b('\n\x11\x61\x64\x64ressbook.proto\x12\x08tutorial\"\xda\x01\n\x06Person\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\n\n\x02id\x18\x02 \x02(\x05\x12\r\n\x05\x65mail\x18\x03 \x01(\t\x12+\n\x05phone\x18\x04 \x03(\x0b\x32\x1c.tutorial.Person.PhoneNumber\x1aM\n\x0bPhoneNumber\x12\x0e\n\x06number\x18\x01 \x02(\t\x12.\n\x04type\x18\x02 \x01(\x0e\x32\x1a.tutorial.Person.PhoneType:\x04HOME\"+\n\tPhoneType\x12\n\n\x06MOBILE\x10\x00\x12\x08\n\x04HOME\x10\x01\x12\x08\n\x04WORK\x10\x02\"/\n\x0b\x41\x64\x64ressBook\x12 \n\x06person\x18\x01 \x03(\x0b\x32\x10.tutorial.Person')
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)



_PERSON_PHONETYPE = _descriptor.EnumDescriptor(
  name='PhoneType',
  full_name='tutorial.Person.PhoneType',
  filename=None,
  file=DESCRIPTOR,
  values=[
    _descriptor.EnumValueDescriptor(
      name='MOBILE', index=0, number=0,
      options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='HOME', index=1, number=1,
      options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='WORK', index=2, number=2,
      options=None,
      type=None),
  ],
  containing_type=None,
  options=None,
  serialized_start=207,
  serialized_end=250,
)
_sym_db.RegisterEnumDescriptor(_PERSON_PHONETYPE)


_PERSON_PHONENUMBER = _descriptor.Descriptor(
  name='PhoneNumber',
  full_name='tutorial.Person.PhoneNumber',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='number', full_name='tutorial.Person.PhoneNumber.number', index=0,
      number=1, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='type', full_name='tutorial.Person.PhoneNumber.type', index=1,
      number=2, type=14, cpp_type=8, label=1,
      has_default_value=True, default_value=1,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=128,
  serialized_end=205,
)

_PERSON = _descriptor.Descriptor(
  name='Person',
  full_name='tutorial.Person',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='name', full_name='tutorial.Person.name', index=0,
      number=1, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='id', full_name='tutorial.Person.id', index=1,
      number=2, type=5, cpp_type=1, label=2,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='email', full_name='tutorial.Person.email', index=2,
      number=3, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='phone', full_name='tutorial.Person.phone', index=3,
      number=4, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[_PERSON_PHONENUMBER, ],
  enum_types=[
    _PERSON_PHONETYPE,
  ],
  options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=32,
  serialized_end=250,
)


_ADDRESSBOOK = _descriptor.Descriptor(
  name='AddressBook',
  full_name='tutorial.AddressBook',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='person', full_name='tutorial.AddressBook.person', index=0,
      number=1, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=252,
  serialized_end=299,
)

_PERSON_PHONENUMBER.fields_by_name['type'].enum_type = _PERSON_PHONETYPE
_PERSON_PHONENUMBER.containing_type = _PERSON
_PERSON.fields_by_name['phone'].message_type = _PERSON_PHONENUMBER
_PERSON_PHONETYPE.containing_type = _PERSON
_ADDRESSBOOK.fields_by_name['person'].message_type = _PERSON
DESCRIPTOR.message_types_by_name['Person'] = _PERSON
DESCRIPTOR.message_types_by_name['AddressBook'] = _ADDRESSBOOK

Person = _reflection.GeneratedProtocolMessageType('Person', (_message.Message,), dict(

  PhoneNumber = _reflection.GeneratedProtocolMessageType('PhoneNumber', (_message.Message,), dict(
    DESCRIPTOR = _PERSON_PHONENUMBER,
    __module__ = 'addressbook_pb2'
    # @@protoc_insertion_point(class_scope:tutorial.Person.PhoneNumber)
    ))
  ,
  DESCRIPTOR = _PERSON,
  __module__ = 'addressbook_pb2'
  # @@protoc_insertion_point(class_scope:tutorial.Person)
  ))
_sym_db.RegisterMessage(Person)
_sym_db.RegisterMessage(Person.PhoneNumber)

AddressBook = _reflection.GeneratedProtocolMessageType('AddressBook', (_message.Message,), dict(
  DESCRIPTOR = _ADDRESSBOOK,
  __module__ = 'addressbook_pb2'
  # @@protoc_insertion_point(class_scope:tutorial.AddressBook)
  ))
_sym_db.RegisterMessage(AddressBook)


# @@protoc_insertion_point(module_scope)

编辑 1

已尝试 pip install protobuf,遇到以下错误,

Requirement already satisfied (use --upgrade to upgrade): protobuf in /Users/foo/miniconda2/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): six>=1.9 in /Users/foo/miniconda2/lib/python2.7/site-packages/six-1.10.0-py2.7.egg (from protobuf)
Requirement already satisfied (use --upgrade to upgrade): setuptools in /Users/foo/miniconda2/lib/python2.7/site-packages (from protobuf)

这是python版本的输出,

python -V
Python 2.7.11 :: Continuum Analytics, Inc.

编辑 2

Post 准确的错误信息,

Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1531, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 938, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Users/foo/personal/featureExtraction/protobuf_test.py", line 1, in <module>
    from addressbook_pb2 import Person
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_bundle/pydev_monkey_qt.py", line 71, in patched_import
    return original_import(name, *args, **kwargs)
  File "/Users/foo/personal/featureExtraction/addressbook_pb2.py", line 6, in <module>
    from google.protobuf import descriptor as _descriptor
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_bundle/pydev_monkey_qt.py", line 71, in patched_import
    return original_import(name, *args, **kwargs)
ImportError: No module named google.protobuf

编辑 3

import google

时的错误信息

编辑 4

which pip

的输出
which pip
/Users/foo/miniconda2/bin/pip

sys.executable

的输出

/Users/foo/anaconda/bin/python

编辑 5

foo-mn1:featureExtraction foo$ sudo /Users/foo/miniconda2/bin/pip install protobuf
Password:
The directory '/Users/foo/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/foo/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied (use --upgrade to upgrade): protobuf in /Users/foo/miniconda2/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): six>=1.9 in /Users/foo/miniconda2/lib/python2.7/site-packages/six-1.10.0-py2.7.egg (from protobuf)
Requirement already satisfied (use --upgrade to upgrade): setuptools in /Users/foo/miniconda2/lib/python2.7/site-packages (from protobuf)
foo-mn1:featureExtraction foo$ sudo /Users/foo/miniconda2/bin/pip install google
The directory '/Users/foo/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/foo/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied (use --upgrade to upgrade): google in /Users/foo/miniconda2/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): beautifulsoup4 in /Users/foo/miniconda2/lib/python2.7/site-packages (from google)

你应该运行:

pip install protobuf

这将安装 Google protobuf,然后您可以 运行 该 Python 脚本。

根据 this link.

pip告诉你你已经有protobuf时, 但是 PyCharm (或其他)告诉你你没有, 这意味着 pip 和 PyCharm 使用不同的 Python 解释器。 这是一个非常常见的问题,尤其是在没有标准 Python 包管理的 Mac 上。

完全消除此类问题的最佳方法是为每个 Python 项目使用一个 virtualenv,它本质上是一个包含 Python 包和环境变量设置的目录,以隔离 Python 项目环境与其他一切。

像这样为您的项目创建一个 virtualenv

cd project
virtualenv --distribute virtualenv -p /path/to/python/executable

这会在您的项目中创建一个名为 virtualenv 的目录。 (确保配置您的 VCS(例如 Git)以忽略此目录。)

要在此virtualenv中安装软件包,您需要激活环境变量设置:

. virtualenv/bin/activate

通过 运行 pip -V 验证 pip 将在 virtualenv 中使用正确的 Python 可执行文件。它应该告诉你使用的 Python 库路径,它应该在 virtualenv.

现在您可以像以前一样使用 pip 安装 protobuf

最后,您需要让 PyCharm 使用此 virtualenv 而不是系统库。在项目设置的某处,您可以为项目配置解释器,select virtualenv.

中的 Python 可执行文件

有同样的问题,我通过使用解决了它:

conda install protobuf

我遇到了同样的情况。我发现这是因为 pip 应该更新。这可能与您的问题的原因相同。

在 Mac OS - 安装 tensorflow 1.3 - 它会自动删除其他 protobuf 安装并安装 protobuf 3.4。但是,这不起作用,安装或降级到任何其他 protobuf 版本也不起作用。

不过我找到了解决办法。 不确定为什么会这样 - 但在 Mac OS 上解决了它。

pip install google

造成这种情况的原因主要是邪恶命令pip install googlegoogle-cloud 我遇到了类似的问题,但 protobuf 的步骤也是一样的。我们的两个问题都涉及 'google' 命名空间的命名空间冲突。

如果您像我一样执行了 pip install google 命令,那么您来对地方了。 google 包实际上不属于 Google,这可以通过命令 pip show google 确认,输出:

 Name: google
 Version: 1.9.3
 Summary: Python bindings to the Google search engine.
 Home-page: http://breakingcode.wordpress.com/
 Author: Mario Vilas
 Author-email: mvilas@gmail.com
 License: UNKNOWN
 Location: <Path where this package is installed>
 Requires: beautifulsoup4

因为这个包,google 命名空间被保留,巧合的是 google-cloud 也需要命名空间 google > cloud,这导致这两个包的命名空间冲突。

在下面的 google-protobuf 命名空间截图中看到 google > protobuf

解决方案 :- 非官方 google 软件包需要卸载,这可以通过使用 pip uninstall google 来完成,之后您可以重新安装 google-cloud使用 pip install google-cloudprotobuf 使用 pip install protobuf

脚注 :- 假设您错误地安装了非官方的 google 包并且您实际上并不需要它和 google-cloud 包。如果您同时需要非官方 googlegoogle-cloud,上述解决方案将不起作用。

此外,非官方的 'google' 软件包随 'soupsieve' 和 'beautifulsoup4' 一起安装。您可能还想卸载这些软件包。

如果这能解决您的特定问题,请告诉我。

我得到了与标题中相同的错误消息,但在我的情况下,import google 正在工作而 import google.protobuf 没有(在 python3.5,ubuntu 16.04).

原来我已经安装了 python3-google-apputils 包(使用 apt)并且它被安装到 '/usr/lib/python3 /dist-packages/google/apputils/',而 protobuf(使用 pip 安装)位于“/usr/lib/python3.5/dist-packages/google/protobuf/” - 这是一个 "google" 命名空间崩溃。

卸载 google-apputils(从 apt,然后使用 pip 重新安装)解决了问题。

sudo apt remove python3-google-apputils
sudo pip3 install google-apputils

我也有这个问题,研究了很久。 python 3+上好像没有这个问题。问题其实在google.protobuf

解决方案一:

pip uninstall protobuf
pip uninstall google
pip install google
pip install protobuf
pip install google-cloud

方案二:

在 "google" 文件夹中创建一个 __init__.py

cd /path/to/your/env/lib/python2.7/site-packages/google
touch __init__.py

希望它能奏效。

安装 protobuf:

pip install protobuf

然后像这样导入:

import google.protobuf

I had this issue when using the Python wrapper for DGraph DB, which was somehow fixed by this commit(可能对某人有用)。

这解决了我昨天在 Tensorflow 中导入 google.protobuf 和 Python 3.7.5 的问题。

检查protobuf在哪里

pip show protobuf

如果安装了它你会得到这样的东西

Name: protobuf
Version: 3.6.1
Summary: Protocol Buffers
Home-page: https://developers.google.com/protocol-buffers/
Author: None
Author-email: None
License: 3-Clause BSD License
Location: /usr/lib/python3/dist-packages
Requires: 
Required-by: tensorflow, tensorboard

(如果没有,运行 pip install protobuf

现在进入位置文件夹。

cd /usr/lib/python3/dist-packages

现在运行

touch google/__init__.py

如果您是 windows 用户并尝试在 cmd 中启动 py-script - 不要忘记在文件名前输入 python .

python script.py

如果忘记输入,我会遇到“没有名为 google 的模块”错误。

要查找名称 google 冲突的地方....试试这个:

python3

然后 >>> help('google')

...我得到了关于 google-auth:

的信息
NAME
    google

PACKAGE CONTENTS
    auth (package)
    oauth2 (package)

再试试

pip show google-auth

然后

sudo pip3 uninstall google-auth

... 并重试 >>> help('google')

然后我看到 protobuf:

NAME
    google

PACKAGE CONTENTS
    protobuf (package)

我用的是jetson nano jetpack 4.6 简单的方法:

让 tensorflow 卸载并重新安装

对我有用

我在 windows 上尝试使用 pip install protobuf

安装 protobuf 时遇到了这个问题 Requirement already satisfied: protobuf
     *************************************************************
     *** Could not import the Google protobuf Python libraries ***
     *** Try installing package 'python-protobuf' or similar.  ***
     *************************************************************

这是由于 python --version 指向 v2.7 而 pip --version 指向 python v3.6 的路径。

解决方案是确保使用来自 python2

的 pip
python -m pip install protobuf