protobuf google python python-2.7 protocol-buffers

python - ImportError: No hay módulo llamado google.protobuf



proto google (7)

Estoy siguiendo esta guía ( https://developers.google.com/protocol-buffers/docs/pythontutorial ) y utilizo la muestra exacta de addressbook.proto.

Publique también el contenido del archivo addressbook_pb2.py generado por el compilador. Cuando ejecuto el siguiente programa simple, hay un error que dice: ¿no puedo encontrar google.protobuf, alguna idea de cómo resolver este problema? Gracias.

Por cierto, utilizando Python 2.7 en Mac OSX.

from addressbook_pb2 import Person p = Person() p.email = "abc" print p.email

Aquí está el archivo generado automáticamente 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)

Edición 1 ,

pip install protobuf , se reunió con el siguiente error,

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)

Aquí está la salida de la versión de python,

python -V Python 2.7.11 :: Continuum Analytics, Inc.

** Edición 2 **

Publicar mensaje de error exacto,

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

Edición 3 ,

mensaje de error al import google ,

Edición 4 ,

Salida de which pip ,

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

Salida de sys.executable ,

/ Usuarios / foo / anaconda / bin / python

Edición 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)


Cuando pip te dice que ya tienes protobuf , pero PyCharm (u otro) te dice que no lo tienes, significa que pip y PyCharm están usando un intérprete de Python diferente. Este es un problema muy común, especialmente en una Mac, sin una administración estándar de paquetes Python.

La mejor manera de eliminar completamente estos problemas es usar un proyecto virtualenv por Python, que es esencialmente un directorio de paquetes de Python y configuraciones de variables de entorno para aislar el entorno Python del proyecto de todo lo demás.

Crea un virtualenv para tu proyecto como este:

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

Esto crea un directorio llamado virtualenv dentro de su proyecto. (Asegúrese de configurar su VCS (por ejemplo, Git) para ignorar este directorio).

Para instalar paquetes en este virtualenv , debe activar la configuración de la variable de entorno:

. virtualenv/bin/activate

Verifique que pip utilizará el ejecutable Python correcto dentro del virtualenv , ejecutando pip -V . Debería indicarle la ruta de la biblioteca de Python utilizada, que debería estar dentro del virtualenv .

Ahora puedes usar pip para instalar protobuf como lo hiciste.

Y, por último, debe hacer que PyCharm use este virtualenv lugar de las bibliotecas del sistema. En algún lugar de la configuración del proyecto puede configurar un intérprete para el proyecto, seleccione el ejecutable de Python dentro de virtualenv .


Deberías correr:

pip install protobuf

Eso instalará Google protobuf y después de eso puede ejecutar ese script de Python.

Según este enlace .


En Mac OS - Instalar tensorflow 1.3 - eliminará automáticamente otras instalaciones de protobuf e instalará protobuf 3.4. Sin embargo, esto no funciona y tampoco lo hace la instalación o la degradación de ninguna otra versión de protobuf.

Sin embargo encontré una solución. No estoy seguro de por qué esto funciona, pero en Mac OS esto lo resolvió.

pip install google


La razón de esto sería en su mayoría por debajo del comando mal pip install google . Me protobuf a un problema para google-cloud los mismos pasos son protobuf para protobuf , ya que protobuf también se instala en google > protobuf namespace.

Si ha ejecutado este comando como yo, entonces está en el lugar correcto, en realidad el paquete de google no es propiedad de Google, lo que puede confirmarse con el comando pip show google salida de pip show google que debería ser algo como la siguiente.

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

Por lo tanto, debido a lo anterior, el espacio de nombres de google está reservado para este paquete y, coincidentemente, google-cloud también espera que google > cloud espacio de nombres sea una google > cloud lo que provoca la colisión del espacio de nombres de estos dos paquetes.

Vea más abajo el espacio de nombres de captura de pantalla de google-protobuf como google > protobuf

Solución : - El paquete de google no oficial debe desinstalarse, lo que se puede hacer mediante el uso de pip uninstall google después de esto, puede reinstalar google-cloud usando pip install google-cloud o protobuf usando pip install protobuf

FootNotes: - Suponiendo que haya instalado un paquete de google no oficial por error y que en realidad no lo necesita junto con el paquete de google-cloud . Si necesita una solución no oficial de google y google-cloud solución no funcionará.

Déjame saber si esto resuelve tu problema particular.


Me encontré con la misma situación. Y descubro que es porque el pip debería actualizarse. Puede ser la misma razón para su problema.


Recibí el mismo mensaje de error que en el título, pero en mi caso, la import google estaba funcionando y la import google.protobuf no estaba (en python3.5, ubuntu 16.04).

Resultó que he instalado el python3-google-apputils (usando apt) y se instaló en ''/ usr / lib / python3 / dist-packages / google / apputils /'', mientras que protobuf (que se instaló usando pip) estaba en "/ usr / lib / python3.5 / dist-packages / google / protobuf /" - y fue un colapso de espacio de nombres "google".

Desinstalar google-apputils (desde apt y reinstalarlo usando pip) resolvió el problema.

sudo apt remove python3-google-apputils sudo pip3 install google-apputils


Tenía el mismo problema y lo resolví usando:

conda install protobuf