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