在Windows上嵌入Python:为什么它必须是DLL?

Mik*_*hin 9 python windows dll

我正在尝试编写一个嵌入Python的软件插件.在Windows上,插件在技术上是一个DLL(这可能是相关的).在Python中的Windows常见问题解答说:

1. 不要直接将Python构建到.exe文件中.在Windows上,Python必须是一个DLL来处理导入本身就是DLL的模块.(这是第一个未记录的关键事实.)而是链接到pythonNN.dll; 它通常安装在C:\ Windows\System中.NN是Python版本,Python 2.3的数字如"23".

我的问题是为什么Python必须是一个DLL?如果,在我的情况下,主机应用程序不是.exe,而是DLL,我可以在其中构建Python吗?或者,也许,这个说明意味着第三方C扩展依赖于pythonN.N.dll存在而其他DLL不会这样做?假设我真的想拥有一个DLL,我该怎么办?

我看到有dynload_win.c文件,它似乎是在Windows上导入C扩展的模块,据我所知,它扫描扩展文件以找到pythonX.X.dll它导入的内容; 但我对Windows没有经验,我不太了解那里的所有代码.

Tho*_*ers 4

您需要pythonXY.dll作为 DLL 链接,而不是将相关代码直接链接到可执行文件中,因为否则 Python 运行时无法加载其他DLL(它依赖的扩展模块)。如果您制作自己的 DLL,理论上您可以链接直接调用该 DLL 中的所有 Python 代码,因为它最终不会出现在可执行文件中,但仍位于 DLL 中。但是,您必须注意正确进行链接,因为几乎没有标准工具(如 distutils)可以为您执行此操作。

然而,无论你如何嵌入Python,你都不能用DLL,也不能只用任何DLL。ABI 在 Python 版本之间发生变化,因此如果您针对 Python 2.6 编译代码,则需要python26.dll;你不能使用python25.dllpython27.dll。Python 不仅仅是一个 DLL;它也是一个 DLL。它还需要它的标准库,其中包括扩展模块(它们本身就是 DLL,尽管它们具有扩展名。)您遇到.pyd的代码是用于加载这些DLL 的,与加载.dynload_win.cpythonXY.dll

简而言之,为了将 Python 嵌入到您的插件中,您需要随插件一起提供 Python,或者要求已经安装了正确的 Python 版本。