好吧,我有一个Python包。我需要将其编译为dll,然后以易于导入的方式分发它。 如何?您可以建议*.pyc
。但我在任何地方读到任何*.pyc
都可以轻易反编译!
更新
请遵循以下内容:
1)我写了一个python包
2)想要分发它
3)不要分发来源
4)* .pyc是可分解的>>来源可以提取!
5)dll是标准的
答案 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
文件。这取决于您正在构建什么样的工具或程序以及您希望如何执行它。一旦我完成工具或程序,我主要创建一个执行文件(exe
,app
),但这更适合最终用户。这可以使用py2exe
和py2app
(均为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世界中。