如何在Python 3中使用Python 2中的.so模块?

时间:2014-05-05 17:13:40

标签: python linux shared-libraries python-module

可能我的问题显而易见但我无法找到明显的决定。

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

由于suspicions about the incorrect handling of dynamic memory in python 2.6+,我想在最新的Python解释器中使用此扩展。出于某种原因,我无法从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解释器的过程,我会很高兴。在这种情况下,很难相信第二和第三分支之间的向后兼容性也被打破了。谢谢。

1 个答案:

答案 0 :(得分:4)

必须为每个特定的Python版本编译

.so个模块 - 您甚至不能重用Python 2.6为Python 2.6构建的.so模块。

当越过Python 3时,它变得更糟,since there are some API changes,并且SO根本不会从.C文件中构建不变(可能有例外)。

一种解决方法是使用xmlrpc提供要在2.6模块中使用的函数,然后从运行Python 3.x的单独Python进程调用 - 这应该是最简单的方法。