【问题标题】:Python module and multiple python-dev installationsPython 模块和多个 python-dev 安装
【发布时间】:2018-12-14 08:54:31
【问题描述】:

我正在开发一个 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 由 Swig 生成 C 源代码也很重要。错误也来自 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

【问题讨论】:

  • setuptools 应该自动从您用来运行它的任何 Python 解释器中获取所有内容。如果您使用python3 setup.py install 并且python3 是您的3.4,那么它将使用3.4 安装;如果您使用 ~/src/python/bin/python setup.py install 并且这是 3.7 的本地版本,那么它将使用该安装等。
  • 谢谢。我正在从 tox 安装,它会处理所有事情。我已将 tox 配置为使用 Python 2.7 和 3.4。我在 3.4“未定义符号:PyInstance_Type”中收到此错误。我也设置了 travis,但出现了不同的错误。
  • 您应该编辑您的问题以说明您正在使用tox,以及您如何配置它,以及您要构建什么。这绝对不是setuptools 问题。这可能是tox 问题。或者可能只是您有一些不兼容 3.x 的 C 扩展模块,并且正试图将 C API 用于旧式类,在这种情况下,修复它的唯一方法是移植该 C自己编写 3.x 代码。 (除非您只是使用该模块的旧版本,并且只需要更新到新版本……)

标签: python python-3.x python-2.7 module


【解决方案1】:

我在使用 Python2.x 库创建 SWIG 模块然后尝试使用 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.7Python3 之间的差异。 从 Python2 导入(或为所需的 python3.x 库编译)为我解决了这个问题

希望这会有所帮助!
安德烈斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 2017-07-24
    • 2016-04-08
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多