有没有办法使用py2exe或其他方法来生成DLL文件,而不是exe文件?
我想基本上创build一个普通的函数,但正常的win32 DLL,但这些函数将被编码在Python而不是C ++。
我想你可以通过做一些黑客来解决这个问题:
没有测试,但我认为理论是正确的。
本质上,你重新实现py2exe的输出可执行文件的main()在你的DLL。
我怀疑py2exe是这样做的,因为它的体系结构提供了一个引导.exe,推出python解释器并运行它。
但是,为什么不把Python嵌入到C代码中,并将其作为DLL编译?
我不知道py2exe
能够做到这一点,因为我相信它实际上并没有将对象符号从你的Python代码中取出,而只是将编译后的字节码嵌入到Python运行时的可执行文件中。
创建本地库可能需要使用Python-C API进行更多的工作(定义C / C ++接口)。 为此,使用Elmer可能会稍微容易些。
对于后人,我能够使用Elmer最近成功地生成一个可用的DLL。 他们的网站有一个构建加载python代码的DLL包装的例子 。 这很酷,因为你可以随时改变Python代码来改变DLL的行为以进行调试。
不幸的是,对于我来说,我想要一个可移植的DLL,不需要安装python。 这部分并没有很好的工作。 而不是重复所有的步骤,这里是一个链接到我采取的步骤的答案: 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 )