web-dev-qa-db-ja.com

ImportError:google.protobufという名前のモジュールはありません

このガイドに従って( https://developers.google.com/protocol-buffers/docs/pythontutorial )、addressbook.protoの正確なサンプルを使用しています。

コンパイラが生成したaddressbook_pb2.pyファイルのコンテンツも投稿します。次の簡単なプログラムを実行すると、「google.protobufが見つかりません」というエラーが表示されます。この問題を解決する方法はありますか?ありがとう。

ところで、Mac OSXでPython 2.7を使用しています。

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

Edit 3

import googleの場合のエラーメッセージ、

enter image description here

Edit 4

which pipの出力、

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

sys.executableの出力、

/ Users/foo/anaconda/bin/python

Edit 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

同じ問題があり、次を使用して解決しました:

conda install protobuf
28
Marl

あなたが実行する必要があります:

pip install protobuf

これでGoogle protobufがインストールされ、その後Pythonスクリプトを実行できます。

このリンク に従って。

29
David Gomes

この理由は、ほとんどevilcommand pip install google以下です。 google-cloudの問題に直面していました。protobufにも同じ手順が当てはまります。protobufgoogle > protobuf名前空間にインストールされます。

私のようにこのコマンドを実行した場合、実際には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を想定しているため、これら2つのパッケージの名前空間の衝突が発生します。

以下のスクリーンショットのgoogle-protobufの名前空間をgoogle > protobufとして参照してください

google-cloud namespace screenshot google > cloud > datastore

Solution:-非公式googleパッケージをアンインストールする必要があります。これはpip uninstall googleを使用して実行できます。この後、google-cloudを再インストールできますpip install google-cloudまたはpip install protobufを使用するprotobuf

脚注:-非公式のgoogleパッケージを誤ってインストールし、google-cloudパッケージと一緒に実際にそれを必要としないと仮定します。非公式のgooglegoogle-cloudの両方が必要な場合、上記のソリューションは機能しません。

これで特定の問題が解決するかどうかをお知らせください。

9
vinit payal

Mac OS-tensorflow 1.3のインストール-他のprotobufインストールを自動的に削除し、protobuf 3.4をインストールします。ただし、これは機能せず、インストールも他のprotobufバージョンへのダウングレードも行われません。

しかし、解決策を見つけました。これがなぜ機能するのかはわかりませんが、Mac OSではこれで解決しました。

pip install google
7
Bruce Matichuk

pipが既にprotobufを持っていることを示しているが、PyCharm(またはその他)が持っていないことを示している場合、それはpipとPyCharmが異なるPythonインタープリター。これは、特にMacで標準のPythonパッケージ管理がない非常に一般的な問題です。

このような問題を完全に排除する最善の方法は、Pythonプロジェクトごとにvirtualenvプロジェクトを使用することです。これは、本質的にPythonパッケージと環境変数設定のディレクトリであり、Python他のすべてのプロジェクトの環境。

次のように、プロジェクトのvirtualenvを作成します。

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

これにより、プロジェクト内にvirtualenvというディレクトリが作成されます。 (このディレクトリを無視するようにVCS(Gitなど)を設定してください。)

このvirtualenvにパッケージをインストールするには、環境変数の設定を有効にする必要があります。

. virtualenv/bin/activate

pip -Vを実行して、pipvirtualenv内で正しいPython実行可能ファイルを使用することを確認します。 Python使用されているライブラリパスがわかります。これはvirtualenv内にある必要があります。

これで、pipを使用して、protobufをインストールできます。

そして最後に、PyCharmにシステムライブラリの代わりにこのvirtualenvを使用させる必要があります。プロジェクト設定のどこかでプロジェクトのインタープリターを構成できます。virtualenv内のPython実行可能ファイルを選択します。

5
janos

私もこの問題を抱えており、長い間検討してきました。 python 3+にはそのような問題はないようです。問題は実際にはgoogle.protobufにあります

解決策1:

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

解決策2:

「google」フォルダに__init__.pyを作成します。

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

うまくいけばうまくいくでしょう。

1
Jerryhtz

タイトルと同じエラーメッセージが表示されましたが、私の場合はimport googleが機能しており、import google.protobufが機能していませんでした(python3.5、ubuntu 16.04)。

python3-google-apputilsパッケージ(aptを使用)をインストールし、 '/ usr/lib/python/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
1
Ohad Cohen

私は同じ状況に遭遇しました。そして、pipを更新する必要があるためです。それはあなたの問題の同じ理由かもしれません。

1
Jacky Wang

protobufがインストールされている場合は、次のようにインポートします

pip install protobuf

import google.protobuf

この問題が発生しました DGraph DBのPythonラッパーを使用している場合、 this commit (おそらく誰かに使用される)で修正されました。

0
Tails