لماذا أرى "لا يمكنني استيراد اسم descriptor_pb2" عند استخدام المخازن المؤقتة بروتوكول Google؟
-
11-09-2019 - |
سؤال
عند استخدام رمز Python الذي تم إنشاؤه من فئات Protobuf الخاصة بنا، نحصل على هذا الخطأ:
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/
هو مجلد مع فصول بيثون التي تم إنشاؤها.
بعد ذلك، يعمل ما يلي على ما يرام:
sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet
../gen/descriptor_pb2.py
يجب أن موجود.
نصائح أخرى
في حالتي، لم يتم حدوث العثور على Descriptor_PB2 لأن Protobuf لم يتم تثبيته بشكل صحيح. في الدليل الفرعي Python Protobuf، تأكد من تشغيل
python setup.py build
python setup.py test
python setup.py install (as root)
يرجى التأكد من تثبيت مكتبة تشغيل Protobuf وفقا لتوجيهات ملف ReadMe. لا يمكنك ببساطة استخدام المصدر مباشرة من الحزمة، نظرا لأن Descrimcriptor_PB2.py يجب أن يتم إنشاؤها بواسطة PROTOC (مترجم Protobuf) كجزء من عملية التثبيت.
يمكنني استخدام Python 2.7 على Windows 10.
في حالتي، قمت بتنزيل PROTOC-3.0.0-Beta-2-Win32 من https://github.com/google/protobuf/releases. ونسخ ملف البروتوك الثنائي إلى مجلد SRC.
بعد ذلك قمت بتشغيل الأمر Python Setup.py Build. وتم إنشاء descriptor_pb2.
Python Setup.py Build.
هذه الخطوة إلزامية لأنها ولدت بعض الملفات المصدر.
توليد Google / Protobuf / descriptor_pb2.py ... توليد Google / Protobuf / Compiler / Plugin_pb2.py ... توليد Google / Protobuf / Unittest_pb2.py ... توليد Google / Protobuf / Unittest_custom_options_pb2.py ... توليد Google / Protobuf /Nittest_import_pb2.py ... توليد Google / Protobuf / Unittest_import_public_pb2.py ... توليد Google / Protobuf / Unittest_mset_pb2.py ... توليد Google / Protobuf / Unittest_no_generic_services_pb2.py ... توليد Google / Protobuf / Descriptor_pool_test1_pb2.pain . .py ... توليد Google / Protobuf / Internal / more_extensions_dynamic_pb2.py ... توليد Google / Protobuf / Internal / More_messages_pb2.py ... توليد Google / Protobuf / Internal_test1_pb2.py ... توليد Google / Protobuf / Internal / بحكم الواقع ry_test2_pb2.py ... توليد جوجل / protobuf / pyext / python_pb2.ps ... bla ...
بالتحديد "descriptor_pb2.py"