ImportError: нет модуля с именем google.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)

Ответ 1

Имел ту же проблему, и я разрешил ее, используя:

conda install protobuf

Ответ 2

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

pip install protobuf

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

По этой ссылке.

Ответ 3

Причина этого была бы в основном под злой командой 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-cloud namespace screenshot google > cloud > datastore

Решение: - Необходимо удалить неофициальный пакет google что можно сделать с помощью pip uninstall google После этого вы можете переустановить google-cloud с помощью pip install google-cloud или protobuf с помощью pip install protobuf

FootNotes: - Если вы по ошибке установили неофициальный пакет google и вам он не нужен вместе с пакетом google-cloud. Если вам нужен как неофициальный google и google-cloud вышеуказанное решение не сработает.

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

Ответ 4

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

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

pip install google

Ответ 5

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

Ответ 6

У меня тоже есть эта проблема, и я давно ее изучаю. Похоже, что на питоне такой проблемы нет 3+. Проблема на самом деле на google.protobuf

Решение 1:

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

Решение 2:

создайте __init__.py в папке "google".

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

Надеюсь, это сработает.

Ответ 7

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

Ответ 8

Я получил то же сообщение об ошибке, что и в заголовке, но в моем случае 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

Ответ 9

если установлен protobuf, импортируйте его вот так

pip install protobuf

import google.protobuf