【问题标题】:py2exe to generate dlls?py2exe 生成dll?
【发布时间】:2009-02-15 07:06:26
【问题描述】:

有没有办法使用py2exe或其他方法来生成dll文件而不是exe文件?

我想基本上创建一个带有普通函数的普通 win32 dll,但这些函数将用 python 而不是 c++ 编码。

【问题讨论】:

    标签: python windows dll py2exe


    【解决方案1】:

    我认为你可以通过一些黑客攻击来解决这个问题:

    • 看看 py2exe 中的 zipextimporter 模块。它有助于从 zip 导入 pyd 文件。
    • 使用它,您可以使用原始 python-api 在您自己的应用程序/dll 中加载 py2exe 的输出文件。 (如果可以并且愿意,请使用 boost::python)
    • 而且,由于 py2exe 的输出文件是 zip,您可以将其附加到 dll 的末尾,从而使整个文件更加集成。 (也适用于 jar 文件的旧技巧。)

    未经测试,但我认为这个理论是合理的。

    本质上,您在 dll 中重新实现 py2exe 的输出可执行文件的 main()。

    【讨论】:

    • py2exe 有 1 个代码输出路径,main()。您对使用纯 Python 代码指定导出函数/类的方法有任何想法吗?假设我做了某种类似的实用程序 py2dll
    • 没有。我不认为你不写一些 C 就可以做到这一点。我想你会像往常一样运行 py2exe,并使用它的库输出,但是编写你自己的 dll,它会导出一个类似的 'my_pymain' 函数py2exe 的可执行文件。您应该能够从 py2exe 窃取该代码。
    【解决方案2】:

    我怀疑 py2exe 是否这样做,因为它的架构是围绕提供一个引导 .exe 展开并运行 python 解释器。

    但为什么不直接将 Python 嵌入 C 代码中,然后将该代码编译为 DLL?

    【讨论】:

      【解决方案3】:

      我不知道py2exe 能够做到这一点,因为我相信它实际上并没有从您的 Python 代码中生成对象符号,而只是将编译后的字节码嵌入到 Python 运行时的可执行文件中) .

      使用 Python-C API 创建本机库可能需要更多工作(定义 C/C++ 接口)。使用Elmer 可能会更容易一些。

      【讨论】:

        【解决方案4】:

        为了后代,我最近能够使用Elmer 成功生成可用的 DLL。他们的网站has an example of building a DLL wrapper that loads python code。这很酷,因为您可以动态更改 python 代码以更改 DLL 行为以进行调试。

        不幸的是,对我来说,我想要一个无需安装 python 就可以工作的可移植 DLL。那部分并不是开箱即用的。这里不是重复所有步骤,而是指向我所采取步骤的答案的链接:https://stackoverflow.com/a/24811840/3841168。 我确实必须分发 python27.dll、elmer.dll 和几个 .pyd 以及我的 .dll;由于 python27.dll 通常不是静态链接的,因此还需要适当的 .net 运行时。可能有一些方法可以包含大量 dll,但我不介意分发多个 DLL,所以我没有深入研究它。

        【讨论】:

          【解决方案5】:

          看起来可以从py2exe生成COM DLL:

          http://www.py2exe.org/index.cgi/Py2exeAndCtypesComDllServer

            23     my_com_server_target = Target(
            24     description = "my com server",
            25     # use module name for ctypes.com dll server
            26     modules = ["dir.my_com_server"],
            27     # the following line embeds the typelib within the dll
            28     other_resources = [("TYPELIB", 1, open(r"dir\my_com_server.tlb", "rb").read())],
            29     # we only want the inproc (dll) server
            30     create_exe = False
            31     )
          

          【讨论】:

          • tlb 文件从何而来?这部分让我迷失了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-19
          • 2023-04-01
          • 2013-01-26
          • 2015-08-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多