有没有办法使用 py2exe 或其他方法来生成 dll 文件而不是 exe 文件?
我想基本上用普通函数创建一个普通的win32 dll,但这些函数将用python而不是c++编码。
我认为你可以通过做一些黑客攻击来解决这个问题:
没有经过测试,但我认为这个理论是合理的。
本质上,您在 dll 中重新实现了 py2exe 的输出可执行文件的 main()。
我怀疑 py2exe 会这样做,因为它的架构是围绕提供一个引导 .exe 来推出 python 解释器并运行它。
但为什么不直接将 Python 嵌入 C 代码中,然后将该代码编译为 DLL?
我不知道py2exe
能够做到这一点,因为我相信它实际上并没有从你的 Python 代码中生成对象符号,而只是将编译后的字节码嵌入到 Python 运行时的可执行文件中)。
使用 Python-C API 创建本机库可能需要更多工作(定义 C/C++ 接口)。使用Elmer可能会更容易一些。
对于后代,我最近能够使用Elmer成功生成可用的 DLL。他们的网站有一个构建加载 python 代码的 DLL 包装器的示例。这很酷,因为您可以动态更改 python 代码以更改 DLL 行为以进行调试。
不幸的是,对我来说,我想要一个无需安装 python 就可以工作的可移植 DLL。那部分并不是开箱即用的。这里没有重复所有步骤,而是链接到我采取的步骤的答案:https ://stackoverflow.com/a/24811840/3841168 。我确实必须分发 python27.dll、elmer.dll 和几个 .pyd 以及我的 .dll;由于 python27.dll 通常不是静态链接的,因此还需要适当的 .net 运行时。可能有一些方法可以包含大量 dll,但我不介意分发多个 DLL,所以我没有深入研究它。
看起来可以从 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 )