如何将Python包编译为dll

时间:2012-06-02 02:33:23

标签: python dll module compilation

好吧,我有一个Python包。我需要将其编译为dll,然后以易于导入的方式分发它。 如何?您可以建议*.pyc。但我在任何地方读到任何*.pyc都可以轻易反编译!

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

10 个答案:

答案 0 :(得分:9)

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

此外,dll不是标准,不是Python世界。它们也不便携。

答案 1 :(得分:5)

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

答案 2 :(得分:5)

你可以embed python inside C。真正的诀窍是在C值和Python值之间进行转换。但是,一旦你完成了这个,制作DLL就是pretty straightforward

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

答案 3 :(得分:4)

Python embedding is supported in CFFI version 1.5,您可以创建一个可由Windows C应用程序使用的.dll文件。

答案 4 :(得分:2)

我还会使用Cython生成pyd文件,就像Dikei写的那样。 但是如果你真的想要保护你的代码,你最好用C ++编写重要的东西。最好的方法是将 C ++ Python 结合起来。这个想法:你会打开python代码进行调整,这样你就不必一遍又一遍地编译所有内容。这意味着,你会写'"核心"在C ++中(这是目前最安全的解决方案)并在python代码中使用这些dll文件。这取决于您正在构建什么样的工具或程序以及您希望如何执行它。一旦我完成工具或程序,我主要创建一个执行文件(exeapp),但这更适合最终用户。这可以使用py2exepy2app(均为64位兼容)来完成。如果实现解释器,最终用户的机器不必在系统上安装python。

  

pyd文件与dll相同,并且在python中完全支持。所以你通常可以导入你的模块。您可以找到有关它的更多信息here

使用和生成pyd文件是创建安全和可移植python代码的最快速,最简单的方法。

您还可以在C++中撰写真实的dll文件,并使用ctypes将其导入以使用它们(此处为post,此处为python description它是如何工作的)

答案 5 :(得分:1)

您可以使用pyinstaller将.py文件转换为可执行文件,并将所有必需的包转换为.dll格式。

步骤1. pip install pyinstaller,

第2步。新的python文件让我们将其命名为code.py。

步骤3.编写一些代码行,即print(“Hello World”)

步骤4.在同一位置打开命令提示符并编写pyinstaller code.py命中enter。最后一步在同一位置看到两个文件夹名称build,dist将被创建。在dist文件夹里面有文件夹代码,在该文件夹里面有一个exe文件code.exe以及所需的.dll文件。

答案 6 :(得分:1)

  

扩大Nick ODell的答案

您必须在Windows上才能使DLL工作,它们不可移植。

但是下面的代码是跨平台的,并且所有平台都支持运行时,因此可以针对您需要它的每个平台重新编译。

Python(尚未)提供了一个创建dll的简单工具,但是你可以在C / C ++中实现它

首先你需要一个编译器(Windows默认没有),特别是Cygwin,MinGW或Visual Studio。

C的基本知识也是必要的(因为我们将主要用C编码)。

你还需要包含必要的标题,我会跳过这个,所以它不会变得非常长,并假设一切都设置正确。

在本次演示中,我将打印一个传统的hello世界:

我们将转换为DLL的Python代码:

def foo(): print("hello world")

C代码:

#include "Python.h" // Includes everything to use the Python-C API

int foo(void); // Declare foo

int foo(void) { // Name of our function in our DLL

    Py_Initialize(); // Initialise Python

    PyRun_SimpleString("print('hello world')"); // Run the Python commands

    return 0; // Finish execution
}

这是嵌入Python的tutorial。这里应该添加一些额外的东西,但为了简洁起见,我把它们排除了。

编译它,你应该有一个DLL。 :)

这不是全部。您将需要分发所需的任何依赖项,这将意味着运行Python脚本的python36.dll运行时和一些其他组件。

  

我的C编码并不完美,所以如果有人能发现任何改进,请发表评论,我会尽力解决。

在C#中也可能从这个答案How do I call a specific Method from a Python Script in C#?开始,因为C#可以创建DLL,你可以从C#调用Python函数。

答案 7 :(得分:0)

如今,存在一个简单的solutino:将Nuitka编译器用作described in Nuitka User Manual

  

用例2-扩展模块编译   如果您只想编译一个扩展模块,那么您要做的就是:

 python -m nuitka --module some_module.py 
     

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

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

结果不是DLL所请求的,而是Python本地编译的二进制格式(它不是pyc文件中的字节码; so / pyd格式不易反编译-Nuitka通过C ++转换为机器代码)

答案 8 :(得分:0)

这是我的想法,可能会起作用。我不知道是否可行。

1。创建您的*.py文件。
2.将它们重命名为*.pyx
3.使用Cython将它们转换为*.c文件
4.将*.c编译成*.dll个文件。

但是我不推荐您,因为它在Windows以外的任何其他平台上均不起作用。

答案 9 :(得分:-1)

抓住Visual Studio Express和IronPython这样做吗?你会在Python 2.7.6世界中。