Import Error: 没有名为 google.Protobuf 的模块

我遵循 这本指南并使用 addressbook.proto 的精确样例。

发布编译器生成的 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

发送准确的错误信息,

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,

enter image description here

编辑4

which pip输出,

which pip
/Users/foo/miniconda2/bin/pip

sys.executable输出,

/用户/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)
188676 次浏览

你应该跑:

pip install protobuf

这将安装谷歌的原型,然后您可以运行该 Python 脚本。

根据 这个链接

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而不是系统库。在项目设置中的某个地方,您可以为项目配置解释器,选择 virtualenv中的 Python 可执行文件。

遇到了同样的问题,我用以下方法解决了它:

conda install protobuf

我也遇到过同样的情况。我发现这是因为该点应该更新。这可能和你的问题是一样的原因。

在 Mac OS 上-安装张量流1.3-它会自动删除其他的原型程序安装和安装原型程序3.4。但是,这不起作用,也不安装或降级到任何其他版本的原型程序。

但我找到了解决办法。 不知道为什么这个工作-但在 Mac OS 这解决了它。

pip install google

出现这种情况的主要原因是 邪恶命令 pip install google。对于 google-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-cloud namespace screenshot google > cloud > datastore

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

脚注:-假设您错误地安装了非官方的 google软件包,并且实际上不需要它与 google-cloud软件包一起安装。如果你既需要非正式的 googlegoogle-cloud上述解决方案不会工作。

此外,非官方的“ google”软件包安装了“ soupsieve”和“ beautiful fulsoup4”,你可能也想卸载这些软件包。

如果这能解决你的问题,请告诉我。

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

原来我已经安装了 python3-google-apputils软件包(使用 apt) ,它被安装在“/usr/lib/蟒蛇3/dist-package/google/apputils/”,而 Protobuf (使用 pip 安装)在“/usr/lib/Python 3.5/dist-package/google/Protobuf/”-它是一个“ google”名称空间崩溃。

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

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

我也有这个问题,并已经调查了很长时间。在 python3 + 上似乎不存在这样的问题。问题出在 Google.Protobuf 上

解决方案1:

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

解决方案2:

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

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

希望能成功。

安装 Protobuf:

pip install protobuf

然后像这样导入:

import google.protobuf

我在使用用于 DGraph DB 的 Python 包装器时遇到了这个问题 ,这个问题由 这个承诺以某种方式修复(可能对某些人有用)。

这解决了我昨天在 Tensorflow 使用 google.Protobuf 导入和 Python 3.7.5时遇到的问题。

检查原型药在哪里

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 script.py

我有“没有模块命名为谷歌”错误,如果忘记输入它。

要找到谷歌名字冲突的地方... ... 试试这个:

python3

然后是 >>> help('google')

我得到了谷歌认证的信息:

NAME
google


PACKAGE CONTENTS
auth (package)
oauth2 (package)

那就试试

pip show google-auth

然后

sudo pip3 uninstall google-auth

重试 >>> help('google')

然后我看到了原型药:

NAME
google


PACKAGE CONTENTS
protobuf (package)

我用的是喷射纳米喷气背包4.6 简单的方法:

卸载张量流并重新安装

对我有用

我有这个问题 Requirement already satisfied: protobuf的窗口时,试图安装原型机使用 pip install 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