【发布时间】:2017-02-15 00:32:54
【问题描述】:
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 创建 Python 3.x 包,以便能够搜索和查找系统上安装的任何可用的 3.x 版本?
【问题讨论】:
-
鉴于 pragma 来自 PyConfig.h,我认为这更像是 Windows/DLL/Python 的事情,而不是 SWIG 的事情,但这是一个很好的问题。
-
@Flexo 是的,我认为你是对的。但是,我认为可能有一些“棘手”的解决方法。可以删除此编译指示。如果可以使用 LoadLibrary/GetProcAddress 动态加载 Python dll 和函数,那么搜索任何可用的 python3x.dll 二进制文件将很容易。但是鉴于 SWIG 结构,我没有立即看到这样做的方法,它显式链接到 Python
-
嗨!您对此有所了解吗?
-
你可以定义
Py_LIMITED_API,然后它会链接到python3.lib而不是具体的版本。检查 Python.h 标头
标签: python python-3.x swig