Ответ 1
Имел ту же проблему, и я разрешил ее, используя:
conda install protobuf
Я следую этому руководству (https://developers.google.com/protocol-buffers/docs/pythontutorial) и используя точный образец адресной книги .proto.
Опубликовать содержимое файла сгенерированного файла addressbook_pb2.py. Когда я запускаю следующую простую программу, есть ошибка, говорящая, не могу найти google.protobuf, какие-либо идеи, как решить эту проблему? Спасибо.
BTW, используя Python 2.7 на Mac OSX.
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
,
Изменить 4,
Вывод which pip
,
which pip
/Users/foo/miniconda2/bin/pip
Вывод sys.executable
,
/Users/Foo/Анаконда/bin/питон
Изменить 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 -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 -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 -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 -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)
Имел ту же проблему, и я разрешил ее, используя:
conda install protobuf
Вы должны запустить:
pip install protobuf
Это установит Google protobuf и после этого вы сможете запустить этот скрипт на Python.
По этой ссылке.
Причина этого была бы в основном под злой командой pip install google
. Я столкнулся с проблемой для google-cloud
те же шаги выполняются и для protobuf
как protobuf
также устанавливается в пространство имен google > protobuf
.
Если вы выполнили эту команду, как я, то вы находитесь в правильном месте. На самом деле пакет google
не принадлежит Google, что может быть подтверждено командой pip show google
Вывод pip show 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: [email protected]
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
FootNotes: - Если вы по ошибке установили неофициальный пакет google
и вам он не нужен вместе с пакетом google-cloud
. Если вам нужен как неофициальный google
и google-cloud
вышеуказанное решение не сработает.
Дайте мне знать, если это решит вашу конкретную проблему.
В Mac OS - установка tensorflow 1.3 - автоматически удалит другие установки protobuf и установит protobuf 3.4. Тем не менее, это не сработает, и ни установка, ни понижение в какой-либо другой версии protobuf.
Однако я нашел решение. Не уверен, почему это работает, но на Mac OS это решило.
pip install google
Когда pip
сообщает вам, что у вас уже есть protobuf
,
но PyCharm (или другое) говорит вам, что у вас его нет,
это означает, что pip
и PyCharm используют другой интерпретатор Python.
Это очень распространенная проблема, особенно на Mac, без стандартного управления пакетами Python.
Лучший способ полностью устранить такие проблемы - использовать virtualenv
для каждого проекта Python, который по существу является каталогом пакетов Python и настройками переменных среды, чтобы изолировать среду Python проекта от всего остального.
Создайте virtualenv
для своего проекта следующим образом:
cd project
virtualenv --distribute virtualenv -p /path/to/python/executable
Создает в вашем проекте каталог с именем virtualenv
.
(Обязательно настройте свой VCS (например, Git), чтобы игнорировать этот каталог.)
Чтобы установить пакеты в этом virtualenv
, вам необходимо активировать настройки переменной среды:
. virtualenv/bin/activate
Убедитесь, что pip
будет использовать правильный исполняемый файл Python внутри virtualenv
, запустив pip -V
. Он должен указать вам используемый путь библиотеки Python, который должен находиться внутри virtualenv
.
Теперь вы можете использовать pip
для установки protobuf
, как и вы.
И, наконец, вам нужно заставить PyCharm использовать этот virtualenv
вместо системных библиотек. Где-то в настройках проекта вы можете настроить интерпретатор для проекта, выбрать исполняемый файл Python внутри virtualenv
.
У меня тоже есть эта проблема, и я давно ее изучаю. Похоже, что на питоне такой проблемы нет 3+. Проблема на самом деле на google.protobuf
pip uninstall protobuf
pip uninstall google
pip install google
pip install protobuf
pip install google-cloud
создайте __init__.py
в папке "google".
cd /path/to/your/env/lib/python2.7/site-packages/google
touch __init__.py
Надеюсь, это сработает.
Я столкнулся с такой же ситуацией. И я узнаю, что это потому, что пип должен быть обновлен. Это может быть одной и той же причиной вашей проблемы.
Я получил то же сообщение об ошибке, что и в заголовке, но в моем случае 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
если установлен protobuf, импортируйте его вот так
pip install protobuf
import google.protobuf
У меня была эта проблема при использовании оболочки Python для DGraph DB, которая была каким-то образом исправлена этим коммитом (возможно, кому-то пригодился).