我后面看了下python生成的protobuf协议的import段,差异反正是挺大的:
libprotoc 3.13.0:
from google.protobuf.internal import enum_type_wrapper
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_databaselibprotoc 3.21.11:
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database一眼望过去,相比较3.13.0的差异是挺大的。
然后,我又去下载了v3的最后一个版本:v3.20.3。生成的协议的import是这样的,也就是说它已经跟后面v4,也就是v21.x的一致了:
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database但是,运行了程序之后,跟3.13.0的结果却是一致的:崩了。堆栈虽然有些不一样:
[_message.cpython-38-x86_64-linux-gnu.so] google::protobuf::python::InitDescriptor() 0x00007fffe4d3b1bc
[_message.cpython-38-x86_64-linux-gnu.so] google::protobuf::python::InitProto2MessageModule(_object*) 0x00007fffe4d4f500
[_message.cpython-38-x86_64-linux-gnu.so] PyInit__message 0x00007fffe4d55282
[libpython3.8.so.1.0] _PyImport_LoadDynamicModuleWithSpec 0x00007ffff5e67006接着我又试了v4的第一个正式版:v4.21.0,其结果跟v4.21.11是一致的:运行没有问题。
因为我不好升级C++版本的protobuf,所以我并没有办法去测试这一块。但是就目前来看(武断的认为),似乎问题还是在python的protobuf的版本上,升级后应该就没问题了。
我又看了下/usr/local/lib/python3.8/dist-packages/google/protobuf/pyext路径下的文件,v3.x.x下面有以下一组文件:
__init__.py __pycache__ _message.cpython-38-x86_64-linux-gnu.so cpp_message.py而引起错误的正是因为这下面的:_message.cpython-38-x86_64-linux-gnu.so文件。
而后的v4.x.x版本就已经没有这个文件了:
__init__.py __pycache__ cpp_message.py所以这个bug也就不复存在了。
另外附上我查找到的一些相关的问题资料:
python: SIGSEGV when use PyImport_Import import symbol_database #5979
This program requires version 3.3.0 of the Protocol Buffer runtime library #5711