• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python怎样嵌入一个Windows程序?

python 搞java代码 3年前 (2022-05-21) 48次浏览 已收录 0个评论

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

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

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

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

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

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

    <span class="cp">#include</span> <span class="cpf">"python.h"</span><span class="cp"></span>
    <span class="p">...</span>
    <span class="n">Py_Initialize</span><span class="p">();</span>  <span class="c1">// Initialize Python.</span>
    <span class="n">initmyAppc</span><span class="p">();</span>  <span class="c1">// Initialize (import) the helper class.</span>
    <span class="n">PyRun_SimpleString</span><span class="p">(</span><span class="s">"import myApp"</span><span class="p">);</span>  <span class="c1">// Import the shadow class.</span>
    

    www#gaodaima.com来源gaodai#ma#com搞*!代#%^码网搞代码

  5. Python C API 存在两个问题,如果你使用除 MSVC 之外的编译器用于构建 python.dll ,这将会变得明显。

    问题1:采用 FILE* 参数的所谓“极高级”函数在多编译器环境中不起作用,因为每个编译器的FILE结构体概念都不同。从实现的角度来看,这些是非常 _低_ 级的功能。

    问题2:在为void函数生成包装器时,SWIG会生成以下代码:

    <span class="n">Py_INCREF</span><span class="p">(</span><span class="n">Py_None</span><span class="p">);</span>
    <span class="n">_resultobj</span> <span class="o">=</span> <span class="n">Py_None</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">_resultobj</span><span class="p">;</span>
    

    Py_None 是一个宏,它扩展为对 pythonNN.dll 中名为 _Py_NoneStruct 的复杂数据结构的引用。同样,此代码将在多编译器环境中失败。将此类代码替换为:

    <span class="k">return</span> <span class="nf">Py_BuildValue</span><span class="p">(</span><span class="s">""</span><span class="p">);</span>
    

    有可能使用 SWIG 的 %typemap 命令自动进行更改,但我无法使其工作(我是一个完全的SWIG新手)。

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

来源:搞代码网:原文地址:https://www.gaodaima.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python怎样嵌入一个Windows程序?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址