Как использовать.so модули из Python 2 в Python 3?
Возможно, мой вопрос очевиден, но я не смог найти очевидного решения.
Существуют расширения Python 2.6+, называемые Audit и Auparse. Это динамические библиотеки, распространяемые с пакетом audit-libs-python:
[vitaly@thermaltake tmp]$ repoquery -lq audit-libs-python
/usr/lib64/python2.7/site-packages/_audit.so
/usr/lib64/python2.7/site-packages/audit.py
/usr/lib64/python2.7/site-packages/audit.pyc
/usr/lib64/python2.7/site-packages/audit.pyo
/usr/lib64/python2.7/site-packages/auparse.so
Я хотел бы использовать это расширение в современном интерпретаторе Python из-за подозрений о неправильной обработке динамической памяти в Python 2.6+. Почему-то я не могу загрузить их из Python 3.3:
[vitaly@thermaltake ~]$ python3.3
Python 3.3.2 (default, Mar 5 2014, 08:21:05)
[GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append("/usr/lib64/python2.7/site-packages/")
>>> import auparse
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /usr/lib64/python2.7/site-packages/auparse.so: undefined symbol: _Py_ZeroStruct
>>> import audit
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/audit.py", line 28, in <module>
_audit = swig_import_helper()
File "/usr/lib64/python2.7/site-packages/audit.py", line 24, in swig_import_helper
_mod = imp.load_module('_audit', fp, pathname, description)
File "/usr/lib64/python3.3/imp.py", line 183, in load_module
return load_dynamic(name, filename, file)
ImportError: /usr/lib64/python2.7/site-packages/_audit.so: undefined symbol: PyInstance_Type
Я был бы рад, если бы кто-нибудь мог прояснить процедуру импорта модулей такого рода в современный интерпретатор Python. Трудно поверить, что в этом случае была нарушена обратная совместимость между 2-й и 3-й ветвями. Спасибо.
1 ответ
.so
модули должны быть скомпилированы для каждой конкретной версии Python - вы даже не можете повторно использовать .so
модуль построен для Python 2.6 с Python 2.7.
При переходе на Python 3 все ухудшается, так как есть некоторые изменения API, и SO просто не будет собираться без изменений из файла.C (с возможными исключениями).
Одним из обходных путей является предоставление функций, которые вы хотите использовать в модуле 2.6, с помощью xmlrpc, а затем вызов из отдельного процесса Python, выполняющего Python 3.x, - это должно быть самым простым способом.