python怎样嵌入一个Windows程序?
在 Windows 应用程序中嵌入 Python 解释器可以总结如下:
-
请 _不要_ 直接在你的 .exe 文件中内置 Python 。在 Windows 上, Python 必须是一个 DLL ,这样才可以处理导入的本身就是 DLL 的模块。(这是第一个未记录的关键事实。)相反,链接到
pythonNN.dll
;它通常安装在C:WindowsSystem
中。 NN 是 Python 版本,如数字“33”代表 Python 3.3 。你可以通过两种不同的方式链接到 Python 。加载时链接意味着链接到
pythonNN.lib
,而运行时链接意味着链接pythonNN.dll
。(一般说明:python NN.lib
是所谓的“import lib”,对应于pythonNN.dll
。它只定义了链接器的符号。)运行时链接极大地简化了链接选项,一切都在运行时发生。你的代码必须使用 Windows 的
LoadLibraryEx()
程序加载pythonNN.dll
。代码还必须使用使用 Windows 的GetProcAddress()
例程获得的指针访问pythonNN.dll
中程序和数据(即 Python 的 C API )。宏可以使这些指针对任何调用 Python C API 中的例程的 C 代码都是透明的。Borland 提示:首先使用 Coff2Omf.exe 将
pythonNN.lib
转换为 OMF 格式。 -
如果你使用 SWIG ,很容易创建一个 Python “扩展模块”,它将使应用程序的数据和方法可供 Python 使用。SWIG将为你处理所有蹩脚的细节。结果是你将链接到 .exe 文件 中 的C代码 (!) 你不必创建 DLL 文件,这也简化了链接。
-
SWIG 将创建一个 init 函数(一个 C 函数),其名称取决于扩展模块的名称。例如,如果模块的名称是 leo ,则 init 函数将被称为 initleo() 。 如果您使用 SWIG 阴影类,则 init 函数将被称为 initleoc() 。这初始化了一个由阴影类使用的隐藏辅助类。
你可以将步骤 2 中的 C 代码链接到 .exe 文件的原因是调用初始化函数等同于将模块导入 Python ! (这是第二个关键的未记载事实。)
-
简而言之,你可以用以下代码使用扩展模块初始化 Python 解释器。
#include "python.h" ... Py_Initialize(); // Initialize Python. initmyAppc(); // Initialize (import) the helper class. PyRun_SimpleString("import myApp"); // Import the shadow class.