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

3 投票
1 回答
4107 浏览
提问于 2025-04-18 05:26

我可能问的问题很明显,但我找不到一个明确的答案。

有一些叫做auditauparse的Python 2.6+扩展。这些是和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解释器中,我会很感激。很难相信在这种情况下,第二代和第三代之间的兼容性会被打破。谢谢。

1 个回答

5

.so模块必须为每个特定的Python版本进行编译,也就是说,你不能把为Python 2.6编译的.so模块直接用在Python 2.7上。

如果你要切换到Python 3,情况会更糟,因为有一些API的变化,这意味着你不能直接从.C文件构建SO模块(可能有一些例外)

一个解决办法是通过xmlrpc来提供你想在2.6模块中使用的功能,然后在一个单独的运行Python 3.x的Python进程中调用它们——这应该是最简单的方法。

撰写回答