首页 > 解决方案 > Python 模块和多个 python-dev 安装

问题描述

我正在开发一个 Python 模块,并有不同的 Python 开发包,python 2.7、3.4 等。这个 Python 模块是从 C 源代码编译的。我已经设置了 tox 以使用 python2.7 和 python3.4 进行测试。像这样:

[tox]
envlist = py27,py34

[testenv]
basepython =
    py27: python2.7
    py34: python3.4

2.7 中的测试还可以,但在 3.4 中我收到此错误:未定义符号:PyInstance_Type C 源代码由 Swig 生成也很重要。错误也来自 Swig 生成的 py 文件。这是python文件的代码:

from sys import version_info as _swig_python_version_info
if _swig_python_version_info >= (2, 7, 0):
    def swig_import_helper():
        import importlib
        pkg = __name__.rpartition('.')[0]
        mname = '.'.join((pkg, '_mymod')).lstrip('.')
        try:
            return importlib.import_module(mname)
        except ImportError:
            return importlib.import_module('_mymod')
    _mymod = swig_import_helper()
    del swig_import_helper

标签: pythonpython-3.xpython-2.7module

解决方案


使用库创建 SWIG 模块Python2.x然后尝试使用Python3. 例如做这样的事情(在 Ubuntu 17 中测试):

swig -Wall -c++ -python example.i
g++ -std=c++11 -shared -o _example.so -fPIC example_wrap.cxx -L ./lib -lfoo -I ./include  -I/usr/include/python2.7 -Xlinker -rpath ./lib
python3 -c "import example"

会触发以下ImportError: _example.so: undefined symbol: PyInstance_Type

请注意之间的差异-I/usr/include/python2.7,然后使用Python3. 从 Python2 导入(或为所需python3.x库编译)为我解决了这个问题

希望这可以帮助!
安德烈斯


推荐阅读