SWIG和Python:创建一个兼容任何3.x版本的软件包

时间:2017-02-15 00:32:54

标签: python python-3.x swig

SWIG为Python模块生成两个包装层:C包装器代码和Python包装器代码。而且,据我所知,两者都与Python 3.x的特定颠覆无关(目前为3.1-3.6)。

但是,在编译代码时,我必须包含特定3.x版本Python的标题,其中包括PyConfig.h中的特定库版本,例如3.4:pragma comment(lib,"python34.lib") - 这导致Python包必须在运行时中找到并加载python34.dll,并且加载将失败并与任何其他版本一起使用。

但是所有3.x版本都是兼容的,并且对生成的.pyd二进制文件进行简单编辑 - 用python34.dll替换python36.dll使得最终模块可以正常使用Python 3.6。

有没有办法用SWIG创建一个能够搜索和查找系统上安装的任何可用3.x版本的Python 3.x软件包?

1 个答案:

答案 0 :(得分:0)

您可以“强制”将项目链接到python3.lib,而不是链接到python3X.lib(其中X是次要版本)。然后包装器将python3.dll作为其导入的一部分,并且python3.dll将转发到python3X.dll

但是,请注意,您使用的API需要来自一组通用的Python 3 API(我相信从3.2开始,请参见下面的参考)。如果您需要使用3.2以后不存在但从3.3开始存在的API,则SWIG包装器仍将链接到次要库。

例如,如果您使用的是从Python 3.3开始的PyUnicode_AsUTF8PyUnicode_AsUTF8AndSize,然后尝试为3.6和3.7编译包装,尽管这两个API都是相同的,将包含在python36.dllpython37.dll导入中。

参考:PEP 384