このガイドに従って( 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
の場合のエラーメッセージ、
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)
同じ問題があり、次を使用して解決しました:
conda install protobuf
この理由は、ほとんどevilcommand pip install google
以下です。 google-cloud
の問題に直面していました。protobuf
にも同じ手順が当てはまります。protobuf
もgoogle > 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
として参照してください
Solution:-非公式google
パッケージをアンインストールする必要があります。これはpip uninstall google
を使用して実行できます。この後、google-cloud
を再インストールできますpip install google-cloud
またはpip install protobuf
を使用するprotobuf
脚注:-非公式のgoogle
パッケージを誤ってインストールし、google-cloud
パッケージと一緒に実際にそれを必要としないと仮定します。非公式のgoogle
とgoogle-cloud
の両方が必要な場合、上記のソリューションは機能しません。
これで特定の問題が解決するかどうかをお知らせください。
Mac OS-tensorflow 1.3のインストール-他のprotobufインストールを自動的に削除し、protobuf 3.4をインストールします。ただし、これは機能せず、インストールも他のprotobufバージョンへのダウングレードも行われません。
しかし、解決策を見つけました。これがなぜ機能するのかはわかりませんが、Mac OSではこれで解決しました。
pip install google
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
を実行して、pip
がvirtualenv
内で正しいPython実行可能ファイルを使用することを確認します。 Python使用されているライブラリパスがわかります。これはvirtualenv
内にある必要があります。
これで、pip
を使用して、protobuf
をインストールできます。
そして最後に、PyCharmにシステムライブラリの代わりにこのvirtualenv
を使用させる必要があります。プロジェクト設定のどこかでプロジェクトのインタープリターを構成できます。virtualenv
内のPython実行可能ファイルを選択します。
私もこの問題を抱えており、長い間検討してきました。 python 3+にはそのような問題はないようです。問題は実際にはgoogle.protobufにあります
pip uninstall protobuf
pip uninstall google
pip install google
pip install protobuf
pip install google-cloud
「google」フォルダに__init__.py
を作成します。
cd /path/to/your/env/lib/python2.7/site-packages/google
touch __init__.py
うまくいけばうまくいくでしょう。
タイトルと同じエラーメッセージが表示されましたが、私の場合は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
私は同じ状況に遭遇しました。そして、pipを更新する必要があるためです。それはあなたの問題の同じ理由かもしれません。
protobufがインストールされている場合は、次のようにインポートします
pip install protobuf
import google.protobuf
この問題が発生しました DGraph DBのPythonラッパーを使用している場合、 this commit (おそらく誰かに使用される)で修正されました。