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
。(一般说明:pythonNN.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.
Python C API 存在两个问题,如果你使用除 MSVC 之外的编译器用于构建 python.dll ,这将会变得明显。
问题1:采用 FILE* 参数的所谓“极高级”函数在多编译器环境中不起作用,因为每个编译器的FILE结构体概念都不同。从实现的角度来看,这些是非常 _低_ 级的功能。
问题2:在为void函数生成包装器时,SWIG会生成以下代码:
Py_INCREF(Py_None);
_resultobj=Py_None;
return_resultobj;
Py_None 是一个宏,它扩展为对 pythonNN.dll 中名为 _Py_NoneStruct 的复杂数据结构的引用。同样,此代码将在多编译器环境中失败。将此类代码替换为:
returnPy_BuildValue("");
有可能使用 SWIG 的
%typemap
命令自动进行更改,但我无法使其工作(我是一个完全的SWIG新手)。使用 Python shell 脚本从 Windows 应用程序内部建立 Python 解释器窗口并不是一个好主意;生成的窗口将独立于应用程序的窗口系统。相反,你(或 wxPythonWindow 类)应该创建一个“本机”解释器窗口。将该窗口连接到Python解释器很容易。你可以将 Python的 i/o 重定向到支持读写的 _任意_ 对象,因此你只需要一个包含 read() 和 write() 方法的 Python 对象(在扩展模块中定义)。
以上是 python怎样嵌入一个Windows程序? 的全部内容, 来源链接: utcz.com/z/520602.html