なぜ私はGoogleのプロトコルバッファを使用するときにエラー「名前descriptor_pb2をインポートすることはできません」と思いますか?
-
11-09-2019 - |
質問
私たちのいるProtobufクラスから生成されたPythonコードを使用している場合、我々はこのエラーを取得します:
cannot import name descriptor_pb2
同等のC ++のコードだけで正常に動作するので、私たちの実際のプロト定義に問題がないように見えますが発生します。
私は試してみて、そうのように、私たちのクラスをインポートするときに、このエラーが発生します:
import sys
sys.path.append('..\path\to\generated')
sys.path.append('..\contrib\protobuf\python')
from foobar_pb2 import FooBar
これは正しいシステムパスを追加しますか?
私はprotobuf\python\google\protobuf
ためdescriptor_pb2.py
ディレクトリでチェックだけdescriptor.py
を発見した - 私たちは、最新バージョンを使用しているので、私たちは不足しているすべてのファイルを持っていないと仮定します。
誰もが解決策が何であるかを知っていますか?
解決
私はあなたがdescriptor_pb2.py
を自分でprotoc
を生成する必要が信じています:
protoc descriptor.proto --python_out=gen/
gen/
が生成されたPythonのクラスとフォルダです。
その後、次はうまく機能します:
sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet
../gen/descriptor_pb2.py
必見が存在します。
他のヒント
私の場合は、descriptor_pb2を見つけていないが発生しました。 いるProtobufのPythonのサブディレクトリには、実行するようにしてください。
python setup.py build
python setup.py test
python setup.py install (as root)
readmeファイルの指示に従っているProtobufランタイムライブラリをインストールすることを確認してください。 descriptor_pb2.pyは、インストールプロセスの一環として、protoc(いるProtobufコンパイラ)によって生成する必要があるので、あなたは、単に、パッケージから直接ソースを使用することはできません。
私は窓10上のpython 2.7を使用します。
/:私の場合、私は HTTPSからprotoc-3.0.0-β-2-win32のをダウンロードしています/github.com/google/protobuf/releasesはとsrcフォルダにバイナリprotocファイルをコピーしました。
私は、コマンドを実行していることの後ののpython setup.pyビルドをdescriptor_pb2が生成されました。
のpython setup.pyビルド
それは、ソースファイルの一部を生成して、このステップは必須です。
の生成グーグル/いるProtobuf / descriptor_pb2.py ...生成 グーグル/いるProtobuf /コンパイラ/ plugin_pb2.py ...生成 グーグル/いるProtobuf / unittest_pb2.py ...生成 グーグル/いるProtobuf / unittest_custom_options_pb2.py ...生成 グーグル/いるProtobuf / unittest_import_pb2.py ...生成 グーグル/いるProtobuf / unittest_import_public_pb2.py ...生成 グーグル/いるProtobuf / unittest_mset_pb2.py ...生成 グーグル/いるProtobuf / unittest_no_generic_services_pb2.py ...生成 グーグル/いるProtobuf /内部/ descriptor_pool_test1_pb2.py ...生成 グーグル/いるProtobuf /内部/ descriptor_pool_test2_pb2.py ...生成 グーグル/いるProtobuf /内部/ test_bad_identifiers_pb2.py ...生成 グーグル/いるProtobuf /内部/ missing_enum_values_pb2.py ...生成 グーグル/いるProtobuf /内部/ more_extensions_pb2.py ...生成 グーグル/いるProtobuf /内部/ more_extensions_dynamic_pb2.py ...生成 グーグル/いるProtobuf /内部/ more_messages_pb2.py ...生成 グーグル/いるProtobuf /内部/ factory_test1_pb2.py ...生成 グーグル/いるProtobuf /内部/ factory_test2_pb2.py ...生成 グーグル/いるProtobuf / pyext / python_pb2.py ... BLA ...
正確には 'descriptor_pb2.py'