2016-07-31 1 views
11

Я следую этому руководству (https://developers.google.com/protocol-buffers/docs/pythontutorial) и используя точный образец адресной книги.прото.ImportError: Нет модуля с именем google.protobuf

Опубликовать содержимое созданного компилятором файла 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) 

Edit 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 -V 
Python 2.7.11 :: Continuum Analytics, Inc. 

** Edit 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

Edit 4,

Выход which pip,

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

Выход sys.executable,

/Users/Foo/Анаконда/bin/питон

Edit 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) 
+1

Вы назвали один из ваших файлов "google.py"? –

+0

@BryanOakley, no. У меня только адресbook_pb2.py (который является сгенерированным компилятором файлом) и protobuf_test.py (это небольшая простая простую программу, которую я опубликовал). –

+1

Можете ли вы разместить точное сообщение об ошибке. Кроме того, что касается устранения неполадок, что происходит при попытке импортировать google? – jedwards

ответ

7

Если бы тот же вопрос, и я решил его с помощью:

conda install protobuf 
+0

Спасибо за помощь Марл, отметьте свой ответ как ответ. –

+6

Если вы не используете 'conda', вам нужно будет это сделать:' sudo pip install google' и 'sudo pip install protobuf'. –

3

Вы должны запустить:

pip install protobuf 

Это установит Google Protobuf и после этого вы можете запустить этот скрипт на Python.

Согласно this link.

+0

Спасибо Дэвиду, проголосуйте и попробовали и не работали для меня. Отправьте сообщение об ошибке в разделе «Редактировать 1». Если у вас есть какие-то дальнейшие мысли, это будет здорово. –

3

Когда 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.

+0

Спасибо, janos, проголосуйте, а вы знаете, работает ли google.protobuf для интерпретатора python, например miniconda2 или conda? Если нет, мне нужно изменить интерпретатор Python. Интересно, что вы используете интерпретатор Python? –

+1

Я использую официальные интерпретаторы Python 3.5 или Python 2.7. Но метод, который я описываю, должен работать и с другими. Просто следуйте инструкциям, как я описал. Все, что вам нужно, это убедиться, что вы используете один и тот же интерпретатор «pip» в командной строке и PyCharm. И лучший способ убедиться в этом - использовать тот же самый «virtualenv» в обоих, как я объяснил. – janos

0

я столкнулся с той же ситуации. И я узнаю, что это потому, что пип должен быть обновлен. Это может быть по той же причине для вашей проблемы.

5

В Mac OS - установка tensorflow 1.3 - он автоматически удалит другие установки protobuf и установит protobuf 3.4. Однако это не сработает, а также не устанавливает или не отменяет ни одну другую версию protobuf.

Однако я нашел решение. Не знаете, почему это работает, но на Mac OS это решило.

pip install google 
+0

Это работает для меня, но я должен установить два командных инструмента следующим образом: 'sudo pip install google' и' sudo pip install protobuf'. –

+0

'google' не принадлежит Google от 06 NOV 2017. https://github.com/GoogleCloudPlatform/google-cloud-python/issues/4345 – Zak

1

Причиной этого может быть в основном ниже зла команда pip install google. Я столкнулся с проблемой для google-cloud те же шаги, что и для protobuf, также как и protobuf, также устанавливаются в пространстве имен google > protobuf.

Если вы выполнили эту команду, как мне тогда вы на правильном месте, на самом деле 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: [email protected] 
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-cloud или protobuf с использованием pip install protobuf

FootNotes: - Предполагая, что y ou установили неофициальный google пакет по ошибке, и вам это действительно не нужно вместе с пакетом google-cloud. Если вам нужны как неофициальные google, так и google-cloud выше, решение не будет работать.

Дайте мне знать, если это решит вашу проблему.

+1

Спасибо. Должно быть, я сделал, как вы говорите в своем ответе, и для меня жизнь не могла понять это. –

+0

@GrahamPHeath бывает !! даже для меня это заняло много времени, так как это не очень очевидная причина. Но я рад, что это сработало для вашего дела :) –

0

Я получил то же сообщение об ошибке, что и в заголовке, но в моем случае import google работал, а import google.protobuf не было (на python3.5, ubuntu 16.04).

Оказалось, что я установил python3-google-apputils пакет (используя APT) и был установлен в '/ USR/Lib/Python3/Расс-пакеты/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