python怎样嵌入一个Windows程序?

python

在 Windows 应用程序中嵌入 Python 解释器可以总结如下:

  1. 请 _不要_ 直接在你的 .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 格式。

  2. 如果你使用 SWIG ,很容易创建一个 Python “扩展模块”,它将使应用程序的数据和方法可供 Python 使用。SWIG将为你处理所有蹩脚的细节。结果是你将链接到 .exe 文件 的C代码 (!) 你不必创建 DLL 文件,这也简化了链接。

  3. SWIG 将创建一个 init 函数(一个 C 函数),其名称取决于扩展模块的名称。例如,如果模块的名称是 leo ,则 init 函数将被称为 initleo() 。 如果您使用 SWIG 阴影类,则 init 函数将被称为 initleoc() 。这初始化了一个由阴影类使用的隐藏辅助类。

    你可以将步骤 2 中的 C 代码链接到 .exe 文件的原因是调用初始化函数等同于将模块导入 Python ! (这是第二个关键的未记载事实。)

  4. 简而言之,你可以用以下代码使用扩展模块初始化 Python 解释器。

    #include"python.h"

    ...

    Py_Initialize();// Initialize Python.

    initmyAppc();// Initialize (import) the helper class.

    PyRun_SimpleString("import myApp");// Import the shadow class.

  5. 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新手)。

  6. 使用 Python shell 脚本从 Windows 应用程序内部建立 Python 解释器窗口并不是一个好主意;生成的窗口将独立于应用程序的窗口系统。相反,你(或 wxPythonWindow 类)应该创建一个“本机”解释器窗口。将该窗口连接到Python解释器很容易。你可以将 Python的 i/o 重定向到支持读写的 _任意_ 对象,因此你只需要一个包含 read() 和 write() 方法的 Python 对象(在扩展模块中定义)。

以上是 python怎样嵌入一个Windows程序? 的全部内容, 来源链接: utcz.com/z/520602.html

回到顶部