是否可以仅分发 Python 脚本的字节码版本(.pyc 文件)而不是原始 .py 文件?我的应用程序嵌入了 Python 解释器并调用 PyImport_Import 来加载脚本。我如何告诉它查找 .pyc 文件并导入它?
5 回答
使用freeze工具,它作为Tools/freeze包含在 Python 源代码树中。它将 Python 字节码转换为 C 数组;使用 C 编译器,您可以将所有模块嵌入到新程序中,然后将其与标准 Python 模块链接。
请注意,冻结需要 C 编译器。
其他实用程序:
1- PyInstaller
2- Py2Exe
3-挤压
4- cx_freeze
我通过创建 .py 库和使用该库的简单 .py 程序来做到这一点。然后我将库编译为 .pyc 并分发:程序为 .py 源,库为编译的 .pyc。
由于您使用 C++ 编写主程序,因此您可以做任何您想做的事情来保护您的 Python 文件。例如,您可以加密它们以进行分发,然后及时解密它们以将它们导入 Python 解释器。
由于您使用的是 PyImport_Import,因此您可以编写自己的__import__
钩子来导入模块,而不是从文件中而是从内存缓冲区中导入,因此您到 .pyc 文件的转换可以全部在内存中进行,而磁盘上根本没有可理解的 Python 代码。
这应该不是问题,如果您使用py2exe创建独立程序,您只会获得 .pyc 文件。
通常你不需要告诉 python 去寻找 .pyc 文件,无论如何它都会这样做。仅当有更新的 .py 源文件时才会使用它。
但是,您的源代码的保护级别可能不是很高。
在交互式解释器中,这是自动的 - 如果没有 .py,仍将使用 .pyc:
$ echo 'print "hello"' > test.py
$ python -m compileall .
$ rm test.py
$ python -m test
hello
$
您能否尝试一下是否与 API 的工作方式相同?
编辑添加:我同意 Ber,因为您的代码保护将相当薄弱。-O 将删除文档字符串,如果这不会改变程序的行为,这可能会使重构行为变得更加困难,但是您真正需要某种字节码混淆。
我不知道python是否存在现成的混淆工具,但这听起来是可行的,如果你想/可以投入时间(并且不要觉得这样做太傻,并且可以提供你自己的解释器)。