10

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

4

5 回答 5

12

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

请注意,冻结需要 C 编译器。

其他实用程序:

1- PyInstaller

2- Py2Exe

3-挤压

4- cx_freeze

有关 effbot.org 的更多信息

于 2010-01-13T08:44:41.967 回答
5

我通过创建 .py 库和使用该库的简单 .py 程序来做到这一点。然后我将库编译为 .pyc 并分发:程序为 .py 源,库为编译的 .pyc。

于 2010-01-13T08:38:53.343 回答
5

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

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

于 2010-01-13T12:44:11.230 回答
2

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

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

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

于 2010-01-13T08:37:10.860 回答
2

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

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

您能否尝试一下是否与 API 的工作方式相同?

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

我不知道python是否存在现成的混淆工具,但这听起来是可行的,如果你想/可以投入时间(并且不要觉得这样做太傻,并且可以提供你自己的解释器)。

于 2010-01-13T08:46:06.240 回答