ImportError: aucun module nommé google.protobuf
Je suis la suite de ce guide (https://developers.google.com/protocol-buffers/docs/pythontutorial) et à l'aide de l'échantillon exacte de carnet d'adresses.proto.
Post le contenu généré par le compilateur addressbook_pb2.py fichier ainsi.
Quand je lance le programme simple suivant, il y a une erreur de dire, ne peut pas trouver de google.protobuf, les idées de comment résoudre ce problème? Merci.
BTW, à l'aide de Python 2.7 sur Mac OSX.
from addressbook_pb2 import Person
p = Person()
p.email = "abc"
print p.email
Ici est le système automatisé de fichier généré 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,
Essayé pip install protobuf
a rencontré l'erreur suivante,
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)
Voici la sortie de la version de python,
python -V
Python 2.7.11 :: Continuum Analytics, Inc.
**Edit 2 **
Post message d'erreur exact,
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
Modifier 3,
message d'erreur lorsque import google
,
Edition 4
Sortie de which pip
,
which pip
/Users/foo/miniconda2/bin/pip
Sortie de sys.executable
,
/Users/toto/anaconda/bin/python
Modifier 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)
source d'informationauteur Lin Ma
Vous devez vous connecter pour publier un commentaire.
Eu le même problème et je l'ai résolu en utilisant :
Vous devez exécuter:
Qui va installer Google protobuf et après que vous pouvez exécuter ce script Python.
Comme par ce lien.
Sur Mac OS - Installation tensorflow 1.3 - il sera automatiquement supprimer les autres protobuf installe et installer protobuf 3.4. Toutefois, cela ne fonctionne pas et ni ne l'installation ou la rétrogradation à toute autre protobuf version.
Cependant j'ai trouvé une solution.
Pas sûr de savoir pourquoi cela fonctionne - mais sur Mac OS présent résolu.
Quand
pip
vous dit que vous avez déjàprotobuf
mais PyCharm (ou autres) qui vous dit que vous ne l'avez pas,
cela signifie que
pip
et PyCharm utilisez un autre interpréteur Python.C'est un problème très commun, surtout sur un Mac, avec aucun standard de Python de gestion de paquets.
La meilleure façon d'éliminer complètement ces questions à l'aide d'un
virtualenv
par projet de Python, qui est essentiellement un répertoire de paquets Python et les paramètres des variables d'environnement pour isoler le Python environnement du projet de tout le reste.Créer un
virtualenv
pour votre projet comme ceci:Cela crée un répertoire appelé
virtualenv
à l'intérieur de votre projet.(Assurez-vous de configurer votre CV (par exemple Git) pour ignorer ce répertoire.)
Pour installer des paquets dans ce
virtualenv
vous devez activer les paramètres des variables d'environnement:Vérifier que
pip
va utiliser le droit Python exécutable à l'intérieur de lavirtualenv
en exécutantpip -V
. Il devrait vous indiquer la bibliothèque Python chemin d'accès utilisé, qui doit être à l'intérieur de lavirtualenv
.Maintenant, vous pouvez utiliser
pip
pour installerprotobuf
comme vous l'avez fait.Et enfin, vous devez faire PyCharm utiliser cette
virtualenv
au lieu du système de bibliothèques. Quelque part dans les paramètres du projet, vous pouvez configurer les services d'un interprète pour le projet, sélectionnez l'exécutable Python à l'intérieur de lavirtualenv
.La raison de ceci serait principalement au-dessous de mal commande
pip install google
. J'ai été confronté problème pourgoogle-cloud
les mêmes étapes sont vraies pourprotobuf
aussi commeprotobuf
également installés dansgoogle > protobuf
espace de noms.Si vous avez exécuté cette commande comme moi, alors vous êtes au bon endroit en fait
google
paquet n'est pas détenue par google qui peut être confirmé par la commandepip show google
de sortie de ce qui devrait être un peu comme ci-dessousÀ cause de ci-dessus
google
espace est réservé pour ce package et par coïncidencegoogle-cloud
s'attend également de l'espace de nomsgoogle > cloud
et il en résulte de la collision des noms de ces deux paquets.Voir ci-dessous la capture d'écran de l'espace de noms de
google-protobuf
commegoogle > protobuf
Solution :- non officiel
google
paquet doivent être désinstallés qui peut être fait en utilisantpip uninstall google
après cela, vous pouvez réinstallergoogle-cloud
à l'aide depip install google-cloud
ouprotobuf
à l'aide depip install protobuf
Notes de bas de page :- en Supposant que vous avez installé officieuse
google
colis par erreur et que vous n'avez pas besoin de l'utiliser avecgoogle-cloud
paquet. Si vous avez besoin officieuxgoogle
etgoogle-cloud
solution ci-dessus ne fonctionne pas.Laissez-moi savoir si cela résout votre problème particulier.
J'ai rencontré la même situation. Et je trouver qu'il est parce que le pep doit être mis à jour. Il est peut-être la même raison de votre problème.
J'ai eu le même message d'erreur comme dans le titre, mais dans mon cas,
import google
etimport google.protobuf
n'était pas (sur python3.5, ubuntu 16.04).Il s'est avéré que j'ai installé
python3-google-apputils
paquet (à l'aide de apt) et il a été installé le fichier '/usr/lib/python3/dist-packages/google/apputils/', tandis que protobuf (qui a été installé à l'aide de pip) dans "/usr/lib/python3.5/dist-packages/google/protobuf/" - et c'était un "google" espace de noms de l'effondrement.La désinstallation de google-apputils (d'apt, et de le réinstaller à l'aide pip) a résolu le problème.