如何保护Python源代码?

时间:2010-01-13 08:30:09

标签: python c compilation bytecode

是否可以仅分发Python脚本的字节码版本(.pyc文件)而不是原始的.py文件?我的应用程序嵌入了Python解释器并调用PyImport_Import来加载脚本。如何告诉它查找.pyc文件并导入?

5 个答案:

答案 0 :(得分:13)

使用freeze工具,它包含在Python源代码树中,作为Tools/freeze。它将Python字节代码转换为C数组;使用C编译器,您可以将所有模块嵌入到新程序中,然后将其与标准Python模块链接。

请注意,freeze需要一个C编译器。

其他公用事业:

1- PyInstaller

2- Py2Exe

3- Squeeze

4- cx_freeze

more info on effbot.org

答案 1 :(得分:5)

我是通过创建.py库和使用该库的简单.py程序来实现的。然后我将库编译为.pyc并分发:program as .p​​y source and library as compiled .pyc。

答案 2 :(得分:5)

由于您使用C ++编写主程序,因此您可以执行任何保护Python文件的操作。您可以对它们进行加密以进行分发,然后及时解密它们以将它们导入到Python解释器中。例如。

由于您正在使用PyImport_Import,您可以编写自己的__import__挂钩来导入模块,而不是从文件中导入模块,而是从内存缓冲区导入模块,因此转换为.pyc文件可以在内存中进行,不可理解根本就是磁盘上的Python代码。

答案 3 :(得分:2)

这应该不是问题,如果使用py2exe创建独立程序,则只能获取.pyc文件。

通常你不需要告诉python查找.pyc文件,无论如何它都是这样做的。只有当有更新的.py源文件时才会使用它。

但是,源代码的保护级别可能不会很高。

答案 4 :(得分:2)

在交互式解释器中,这是自动的 - 如果没有.py,仍然会使用.pyc:

$ echo 'print "hello"' > test.py
$ python -m compileall .
$ rm test.py
$ python -m test
hello
$

您是否可以尝试使用与API相同的方式?

编辑添加: 我同意Ber的观点,即您的代码保护将相当薄弱。 -O将删除文档字符串,如果这不会改变程序的行为,可能会使重构行为更难,但你真正需要某种字节码混淆。

我不知道python是否存在现成的混淆工具,但是this听起来可行,如果你想/可以投入时间(并且不觉得太傻了,< strong>和可以发送您自己的口译员。)