无法快速获取fastpython protobuf支持的问题

3
我看到应该支持创建Python包装器来读取生成的C++协议缓冲区。
http://yz.mit.edu/wp/fast-native-c-protocol-buffers-from-python/中,我发现一种简单的方法是通过设置环境变量来开启支持:
PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp 如果我这样做,我会得到以下错误:
    import pyFileLib.db_proc_geo_pb2
  File "C:\sandbox\PrortoBuf\lib\pyFileLib\db_proc_geo_pb2.py", line 6, in <module>
    from google.protobuf import descriptor as _descriptor
  File "c:\python\winpython-64bit-3.6.3.0qt5\python-3.6.3.amd64\lib\site-packages\google\protobuf\descriptor.py", line 46, in <module>
    from google.protobuf.pyext import _message
ImportError: cannot import name '_message'

我看到一种扩展protoc生成器的方法,可以本地生成快速Python输出: https://github.com/Cue/fast-python-pb

git clone https://github.com/Cue/fast-python-pb.git

cd fast-python-pb

python setup.py install

在尝试使用--fastpython_out运行protoc时,我遇到了以下错误:

ModuleNotFoundError: No module named 'plugin_pb2'

--fastpython_out: protoc-gen-fastpython: Plugin failed with status code 1.

看起来这与以下内容相关: https://groups.google.com/forum/#!topic/protobuf/5Ywz8gwn9Kk 当使用python安装protocol buffers时,不会生成google.protobuf.compiler.plugin_pb2 python文件,而protobuf/python/setup.py明确定义了生成google.protobuf.descriptor_pb2。如何进行显式安装,或者以其他方式使python中的protobuf性能可接受?
1个回答

6
我在 https://developers.google.com/protocol-buffers/docs/reference/python-generated 的末尾找到了这个小宝石。

还有一个 C++ 实现,用于 Python 消息的 Python 扩展以获得更好的性能。实现类型由环境变量 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION 控制(有效值为 "cpp" 和 "python")。默认值目前为 "python",但将在未来版本中更改为 "cpp"。

请注意,在安装 protobuf 库之前需要设置环境变量,以便构建和安装 Python 扩展。C++ 实现还需要 CPython 平台。有关详细的安装说明,请参见 python/INSTALL.txt。

WinPython 3.6.3 发行版已经预装了 protobuf,但显然在安装过程中没有设置此标志。

使用以下命令进行修复:

set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp

python -mpip install protobuf --upgrade

多年后,当我将WinPython更新到3.8.9.0时,遇到了同样的问题。这次我不得不在pip命令行上添加-I来忽略当前安装的版本。 - Techniquab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接