如何将Python包编译为dll

Dev*_*per 21 python dll module compilation

好吧,我有一个Python包.我需要将它编译为dll,然后以易于导入的方式分发它.怎么样?你可能会建议*.pyc.但我在某处读到任何*.pyc可以轻易反编译的内容!

更新: 遵循以下:
1)我写了一个python包
2)想要分发它
3)不要分发源
4)*.pyc可以解压缩>>源码可以提取!
5)dll是标准的

Mr.*_*itt 17

现在有一个简单的解决方案:使用 Nuitka 编译器,如Nuitka 用户手册中所述

用例 2 - 扩展模块编译 如果您想编译单个扩展模块,您所要做的就是:

python -m nuitka --module some_module.py

然后可以使用生成的文件 some_module.so 代替 some_module.py。

你需要为每个你想要支持的平台进行编译,并编写一些初始化代码来导入so/pyd文件~~适合给定的平台/python版本等~~

[编辑 2021-12]:实际上,在 python 3 中,正确的 so/dll 是根据文件名自动确定的(如果它包含 python 版本和平台 - 目前无法找到此功能的 PEP,但 Nuitka 为它创建了正确的名称)编译模块)。因此,对于python 2.7,库名称将是something.pyd或something.so,而对于python 3,这将更改为something.cp36-win32.pyd或something.cpython-36m-x86_64-linux-gnu.so(对于32位python 3.6在 x86 上)。

结果不是所要求的 DLL,而是 Python 原生编译的二进制格式(它不是像 pyc 文件中的字节码;so/pyd 格式不能轻易反编译 - Nuitka 通过 C++ 翻译编译为机器代码)

编辑[2020-01]:编译的模块易于使用python标准机制进行评估方法 - 例如,它可以作为任何其他模块导入并列出其方法等。为了确保实现不被暴露,还有更多的工作要做完成的不仅仅是编译成二进制模块。


Kie*_*ong 9

在Cython中编写要隐藏的所有内容,并将其编译为pyd.这就像你可以编写python代码一样接近.

另外,dll不是标准,不是Python世界.他们也不便携.

  • 但是dll在Windows世界中是标准的。 (2认同)

jb.*_*jb. 5

您可以使用py2exe.org将python脚本转换为Windows可执行文件.虽然这只适用于Windows,但它没有任何好处.


Nic*_*ell 5

你可以在C里面嵌入python.真正的诀窍是在C值和Python值之间进行转换.但是,一旦你完成了这个,制作一个DLL 非常简单.

但是,为什么需要制作一个DLL?你需要在非python程序中使用它吗?

  • 在问题中给出:1)dll是可移植的,2)没有分发的源代码。 (2认同)
  • http://stackoverflow.com/questions/261638/how-do-i-protect-python-code (2认同)

Ken*_*ung 5

CFFI 1.5 版支持 Python 嵌入,您可以创建一个.dll可供 Windows C 应用程序使用的文件。