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

标签 python linux shared-libraries python-module

可能我的问题很明显,但我找不到明显的决定。

Python 2.6+ 扩展名为auditauparse。这些是随 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 解释器的过程,我会很高兴。很难相信在这种情况下,第二个和第三个分支之间的向后兼容性也被破坏了。谢谢。

最佳答案

.so 模块必须针对每个特定的 Python 版本进行编译 - 您甚至不能将为 Python 2.6 构建的 .so 模块与 Python 2.7 重用。

当过渡到 Python 3 时,情况变得更糟,since there are some API changes , 并且 SO 根本不会从 .C 文件中构建不变(可能有异常(exception))。

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

关于python - 如何在 Python 3 中使用 Python 2 中的 .so 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23477949/

相关文章:

iphone - 通过我的应用分享相机胶卷中的照片

c++ - FreeLibrary() 在 Linux 上工作吗?

python - 使用 Pycharm pytest runner 时如何将插件选项传递给 pytest?

python - 使用英文字母对以母语书写的地址进行地理编码

python - Google Drive API 如何找到文件的路径?

python - 如何在 python 中对 Linux 上具有多个分隔符的行使用 split 和 strip

linux - Nagios Network Analyzer在linux上安装报错

linux - awk/sed : find string and return its previous index

c++ - C++ 中的全局数组会破坏二进制兼容性吗?

python - 八位字节(字节)填充和取消填充,即用两个或 v.v 替换一个字节