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软件包?
答案 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_AsUTF8
或PyUnicode_AsUTF8AndSize
,然后尝试为3.6和3.7编译包装,尽管这两个API都是相同的,将包含在python36.dll
和python37.dll
导入中。
参考:PEP 384