web-dev-qa-db-fra.com

ImportError: Aucun module nommé google.protobuf

Je suis ce guide ( https://developers.google.com/protocol-buffers/docs/pythontutorial ) et j'utilise l'exemple exact de addressbook.proto.

Publiez également le contenu du fichier addressbook_pb2.py généré par le compilateur. Lorsque je lance le programme simple suivant, il y a une erreur qui dit, impossible de trouver google.protobuf, des idées sur la façon de résoudre ce problème? Merci.

BTW, en utilisant Python 2.7 sur Mac OSX.

from addressbook_pb2 import Person

p = Person()
p.email = "abc"

print p.email

Voici le fichier généré automatiquement 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)

Éditez 1 ,

A essayé pip install protobuf, 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 python version,

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

** Modifier 2 **

Poster un 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

Éditez 3 ,

message d'erreur quand import google,

enter image description here

Éditez 4 ,

Sortie de which pip,

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

Sortie de sys.executable,

/ Utilisateurs/foo/anaconda/bin/python

Éditez 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)
32
Lin Ma

Avait le même problème et je l'ai résolu en utilisant:

conda install protobuf
28
Marl

Vous devriez courir:

pip install protobuf

Cela installera Google protobuf et ensuite vous pourrez lancer ce script Python.

Selon ce lien .

29
David Gomes

La raison en serait principalement en dessous de mal commande pip install google. Je faisais face à problème pour google-cloud Les mêmes étapes sont vraies pour protobuf également comme protobuf également être installé dans l'espace de noms google > protobuf.

Si vous avez exécuté cette commande comme moi, alors vous êtes au bon endroit. google Le paquet n'appartient pas à Google. Ce dernier peut être confirmé par la commande 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

Donc, à cause de ce qui précède, google l'espace de noms est réservé pour ce package et, comme par hasard, google-cloud Attend également un espace de noms google > cloud, Ce qui entraîne la collision de l'espace de noms de ces deux packages.

Voir ci-dessous l'espace de noms de capture de google-protobuf Comme google > protobuf

google-cloud namespace screenshot google > cloud > datastore

Solution : - Le paquet non officiel google doit être désinstallé, ce qui peut être fait en utilisant pip uninstall google. Vous pouvez ensuite le réinstaller. google-cloud En utilisant pip install google-cloud Ou protobuf en utilisant pip install protobuf

Note: - En supposant que vous ayez installé un paquet non officiel google par erreur et que vous n'en avez pas réellement besoin avec le paquet google-cloud. Si vous avez besoin à la fois de google non officiel et de google-cloud, La solution ci-dessus ne fonctionnera pas.

Faites-moi savoir si cela résout votre problème particulier.

9
vinit payal

Sous Mac OS - Installation de tensorflow 1.3 - l’application supprime automatiquement les autres installations de protobuf et installe le protobuf 3.4. Cependant, cela ne fonctionne pas, pas plus que l'installation ou la rétrogradation vers une autre version de protobuf.

Cependant j'ai trouvé une solution. Vous ne savez pas pourquoi cela fonctionne - mais sous Mac OS, cela a résolu le problème.

pip install google
7
Bruce Matichuk

Quand pip vous dit que vous avez déjà protobuf, mais que PyCharm (ou autre) vous dit que vous ne l'avez pas, cela signifie que pip et PyCharm utilisent un different Python. C’est un problème très courant, en particulier sur un Mac, sans norme Python.

Le meilleur moyen d’éliminer complètement ces problèmes consiste à utiliser un projet virtualenvper Python, qui est essentiellement un répertoire de Python, packages et variable d’environnement paramètres permettant d’isoler l’environnement du projet Python) de tout le reste.

Créez un virtualenv pour votre projet comme ceci:

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

Cela crée un répertoire appelé virtualenv dans votre projet. (Assurez-vous de configurer votre VCS (par exemple, Git) pour ignorer ce répertoire.)

Pour installer des packages dans ce virtualenv, vous devez activer les paramètres de variable d’environnement:

. virtualenv/bin/activate

Vérifiez que pip utilisera le bon Python dans le virtualenv, en exécutant pip -V. Il devrait vous indiquer le chemin d'accès à la bibliothèque Python utilisé, qui devrait se trouver à l'intérieur du virtualenv.

Vous pouvez maintenant utiliser pip pour installer protobuf comme vous l’avez fait.

Enfin, vous devez faire en sorte que PyCharm utilise ce virtualenv à la place des bibliothèques système. Quelque part dans les paramètres du projet, vous pouvez configurer un interpréteur pour le projet. Sélectionnez le fichier exécutable Python situé dans le virtualenv.

5
janos

J'ai aussi ce problème et je le cherche depuis longtemps. Il semble qu’il n’existe aucun problème de ce type sur python 3+. Le problème est actuellement sur google.protobuf.

Solution 1:

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

Solution 2:

créé un __init__.py dans le dossier "google".

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

Espérons que cela fonctionnera.

1
Jerryhtz

J'ai le même message d'erreur que dans le titre, mais dans mon cas, import google travaillait et import google.protobuf n'était pas (sur python3.5, Ubuntu 16.04).

Il s'est avéré que j'ai installé python3-google-apputils package (en utilisant apt) et il a été installé dans '/ usr/lib/python/dist-packages/google/apputils /', alors que protobuf (qui a été installé à l'aide de pip) était dans "/ usr/lib/python3.5/dist-packages/google/protobuf/"- et il s'agissait d'un effondrement de l'espace de noms" google ".

La désinstallation de google-apputils (d'apt et sa réinstallation à l'aide de pip) a résolu le problème.

Sudo apt remove python3-google-apputils
Sudo pip3 install google-apputils
1
Ohad Cohen

J'ai rencontré la même situation. Et je découvre que c'est parce que le pip doit être mis à jour. Ce peut être la même raison de votre problème.

1
Jacky Wang

si protobuf est installé, importez-le comme ceci

pip install protobuf

import google.protobuf
0

J'ai eu ce problème en utilisant le wrapper Python pour DGraph DB, qui était en quelque sorte corrigé par ce commit (peut-être utile à quelqu'un) .

0
Tails