ImportError: нет модуля с именем google.protobuf

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

Также опубликуйте содержимое сгенерированного компилятором файла addressbook_pb2.py. Когда я запускаю следующую простую программу, возникает ошибка, говорящая, что не удается найти google.protobuf, есть идеи, как решить эту проблему? Спасибо.

Кстати, с использованием 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,

/Пользователи/foo/анаконда/бин/питон

Изменить 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)

person Lin Ma    schedule 31.07.2016    source источник
comment
вы назвали один из ваших файлов google.py?   -  person Bryan Oakley    schedule 31.07.2016
comment
Лин Ма, у вас запущены две отдельные установки Python. Один на /Users/foo/anaconda/ (это тот, который вызывается из вашего кода) и один в /Users/foo/miniconda2/` (это тот, который вы вызываете, когда набираете pip из терминала. Попробуйте найти каталог scripts или bin в /Users/foo/anaconda ( в зависимости от того, что содержит pip) и запускает pip install ... из этого каталога. Это должно установить пакет protobuf в правильном месте, чтобы вы могли использовать его из текущей настройки кода.   -  person jedwards    schedule 01.08.2016
comment
@jedwards, приятно поймать и проголосовать. Хотите знать, следует ли мне использовать pip install google или pip install protobuf?   -  person Lin Ma    schedule 02.08.2016
comment
@jedwards, попытался использовать полный путь для выполнения pip, см. раздел редактирования 5 для обновления. Вроде сказано, что protobuf уже есть. Затем я попытался выполнить из PyCharm, столкнулся с той же проблемой, No module named google.protobuf, если у вас есть еще какие-то мысли, это будет здорово. :)   -  person Lin Ma    schedule 02.08.2016
comment
Попробуйте cd /Users/foo/anaconda/bin, затем ./pip install protobuf -- или -- cd /Users/foo/anaconda/bin, затем ./python -m pip install protobuf   -  person jedwards    schedule 02.08.2016
comment
github.com/tensorflow/tensorflow/issues/890 Это решает эту проблему.   -  person igauravsehrawat    schedule 29.04.2017


Ответы (13)


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

conda install protobuf
person Marl    schedule 30.11.2016
comment
Спасибо за помощь Марл, отметьте свой ответ как ответ. - person Lin Ma; 01.12.2016
comment
Если без использования conda, вам придется сделать это: sudo pip install google и sudo pip install protobuf. - person Johnny; 29.10.2017
comment
Я использую анаконду. почему я должен делать этот пакет таким образом? почему python -m pip install protobuf не работает? - person rvictordelta; 22.10.2018
comment
Не работает для меня. Я пытаюсь использовать тензорный поток версии 1.4. - person lifeisshubh; 01.04.2019
comment
Пробовал с pip3. pip3 install protobuf работает, но pip3 install protobuf3 не удается явно установить пакет google. - person codeman48; 19.08.2019
comment
Большое спасибо! столько сайтов посетил, столько всего перепробовал, ничего не помогло, кроме вашего простого ответа - person user10556443; 15.01.2020
comment
не работает для меня - person Giacomo; 04.05.2021
comment
большое спасибо. pip3 install protobuf работал у меня - person Dulakshi Soysa; 19.06.2021

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

pip install protobuf

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

Согласно этой ссылке.

person David Gomes    schedule 31.07.2016
comment
Спасибо, Дэвид, проголосуй и попробовал, но у меня не работает. Опубликуйте сообщение об ошибке в разделе «Редактировать 1». Если у вас есть еще какие-то мысли, это будет здорово. - person Lin Ma; 31.07.2016
comment
почему это не работает? почему я должен вместо этого делать conda install protobuf? - person rvictordelta; 22.10.2018

У меня тоже есть эта проблема, и я давно ее изучаю. Вроде на питоне 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

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

person Jerryhtz    schedule 17.07.2019

Причина этого в основном связана с злой командой 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: [email protected]
 License: UNKNOWN
 Location: <Path where this package is installed>
 Requires: beautifulsoup4

Из-за этого пакета пространство имен google зарезервировано, и по совпадению google-cloud также ожидает пространство имен google > cloud, что приводит к конфликту пространств имен для этих двух пакетов.

См. на скриншоте ниже пространство имен google-protobuf как google > protobuf

скриншот пространства имен google-cloud google › cloud › datastore

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

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

Кроме того, неофициальный пакет «google» устанавливается вместе с «soupsieve» и «beautifulsoup4». Вы также можете удалить эти пакеты.

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

person vinit payal    schedule 20.12.2017
comment
Спасибо. Я, должно быть, сделал, как вы говорите в своем ответе, и хоть убей меня, я не мог этого понять. - person Graham P Heath; 13.01.2018
comment
@GrahamPHeath случается!! даже у меня это заняло много времени, так как это не совсем очевидная причина. Но ура, я рад, что это сработало для вашего случая :) - person vinit payal; 13.01.2018
comment
Это огромная проблема безопасности, позволяющая какому-то случайному чуваку иметь пакет под названием google. - person JBernardo; 06.05.2021

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

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

pip install google
person Bruce Matichuk    schedule 25.10.2017
comment
У меня это работает, но мне нужно установить две команды-инструменты следующим образом: sudo pip install google и sudo pip install protobuf. - person Johnny; 29.10.2017
comment
google не принадлежит Google с 06 ноября 2017 г. github.com/GoogleCloudPlatform/ google-cloud-python/issues/4345 - person Zak; 07.11.2017

Когда pip говорит вам, что у вас уже есть protobuf, а PyCharm (или другой) говорит вам, что у вас его нет, это означает, что pip и PyCharm используют другой интерпретатор Python. Это очень распространенная проблема, особенно на Mac без стандартного управления пакетами Python.

Лучший способ полностью устранить такие проблемы — использовать проект virtualenv для каждого Python, который, по сути, представляет собой каталог пакетов Python и настроек переменных среды, чтобы изолировать среду Python проекта от всего остального.

Создайте virtualenv для своего проекта следующим образом:

cd project
virtualenv --distribute virtualenv -p /path/to/python/executable

Это создает каталог с именем virtualenv внутри вашего проекта. (Обязательно настройте систему контроля версий (например, Git) на игнорирование этого каталога.)

Чтобы установить пакеты в этот virtualenv, вам нужно активировать настройки переменной среды:

. virtualenv/bin/activate

Убедитесь, что pip будет использовать правильный исполняемый файл Python внутри virtualenv, запустив pip -V. Он должен указать вам путь к используемой библиотеке Python, который должен находиться внутри файла virtualenv.

Теперь вы можете использовать pip для установки protobuf, как вы это делали.

И, наконец, вам нужно заставить PyCharm использовать этот virtualenv вместо системных библиотек. Где-то в настройках проекта можно настроить интерпретатор для проекта, выбрать исполняемый файл Python внутри файла virtualenv.

person janos    schedule 31.07.2016
comment
Спасибо, janos, проголосуйте, и знаете ли вы, работает ли google.protobuf для интерпретатора Python, такого как miniconda2 или conda? Если нет, мне нужно изменить интерпретатор Python. Хотите знать, какой интерпретатор Python вы используете? - person Lin Ma; 01.08.2016
comment
Я использую официальные интерпретаторы Python 3.5 или Python 2.7. Но метод, который я описываю, должен работать и с другими. Просто внимательно следуйте инструкциям, как я описал. Все, что вам нужно, это убедиться, что вы используете один и тот же интерпретатор с помощью pip в командной строке и с помощью PyCharm. И лучший способ убедиться в этом — использовать один и тот же virtualenv в обоих, как я объяснил. - person janos; 01.08.2016

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

person Jacky Wang    schedule 17.06.2017

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

Это решило мою проблему с импортом google.protobuf в Tensorflow и 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 )

Теперь перейдите в папку location.

cd /usr/lib/python3/dist-packages

Теперь беги

touch google/__init__.py
person Wippo    schedule 01.06.2020
comment
Не знал, что protobuf иногда устанавливается в другое место, чем большинство других пакетов. /usr/local/lib64/python3.6/site-packages в моем случае. - person Alex; 03.06.2020

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

pip install protobuf

import google.protobuf
person Jaskaran singh Rajal    schedule 23.08.2019

У меня была эта проблема при использовании оболочки Python для базы данных DGraph, которая каким-то образом исправлено этой фиксацией (возможно, кому-то пригодится).

person Tails    schedule 09.09.2019

Чтобы найти, где имя 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)
person Mike Hallett    schedule 11.02.2021

Если вы пользователь Windows и пытаетесь запустить py-скрипт в cmd, не забудьте ввести python перед именем файла.

python script.py

У меня нет модуля с именем ошибки Google, если я забыл его ввести.

person Sotnik    schedule 01.09.2020