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 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
软件包需要卸载,这可以通过使用 pip uninstall google
来完成,之后您可以重新安装 google-cloud
使用 pip install google-cloud
或 protobuf
使用 pip install protobuf
脚注 :- 假设您错误地安装了非官方的 google
包并且您实际上并不需要它和 google-cloud
包。如果您同时需要非官方 google
和 google-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
我正在关注 this guide 并使用 addressbook.proto 的确切示例。
Post 编译器生成的 addressbook_pb2.py 文件的内容。 当我 运行 下面的简单程序时,出现错误提示,无法找到 google.protobuf,请问如何解决这个问题?谢谢。
顺便说一句,在 Mac OSX.
上使用 Python 2.7from 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
.
有同样的问题,我通过使用解决了它:
conda install protobuf
我遇到了同样的情况。我发现这是因为 pip 应该更新。这可能与您的问题的原因相同。
在 Mac OS - 安装 tensorflow 1.3 - 它会自动删除其他 protobuf 安装并安装 protobuf 3.4。但是,这不起作用,安装或降级到任何其他 protobuf 版本也不起作用。
不过我找到了解决办法。 不确定为什么会这样 - 但在 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
软件包需要卸载,这可以通过使用 pip uninstall google
来完成,之后您可以重新安装 google-cloud
使用 pip install google-cloud
或 protobuf
使用 pip install protobuf
脚注 :- 假设您错误地安装了非官方的 google
包并且您实际上并不需要它和 google-cloud
包。如果您同时需要非官方 google
和 google-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
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
的 pippython -m pip install protobuf