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

原文 标签 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

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

最佳答案

.so必须为每个特定的python版本编译模块-您甚至不能在python 2.7中重用为python2.6构建的.so模块。
当切换到python 3时,情况会变得更糟,since there are some API changes,so只是不会从.c文件中构建不变的文件(可能有例外)。
一种解决方法是使用xmlrpc为2.6模块中要使用的函数提供服务,然后从运行python 3.x的单独python进程调用,这应该是最简单的方法。

相关文章:

python - 熊猫的rank方法中的ValueError没有更多解释

android - 使用Android Renderscript v8支持库会导致与其他共享库的链接错误

python - zip(列表)和zip(*列表)之间的区别[重复]

python - 烧瓶,获取当地时间

c++ - linux指针以及参考和方法

linux - 在清理安装后,PostgreSQL“无法访问服务器配置文件(...)没有这样的文件或目录”

linux - Nginx服务器未重启

c - 在运行时从共享库中导入结构-编译时不包含头文件

c++ - 从现有目标文件创建共享库

python - 如何通过python3在xml中更改element属性的值