是否有可能仅分发Python脚本的字节码版本(.pyc文件),而不是原始的.py文件?我的应用程序嵌入了Python解释器并调用PyImport_Import来加载脚本。如何告诉它查找.pyc文件并导入它?
是否有可能仅分发Python脚本的字节码版本(.pyc文件),而不是原始的.py文件?我的应用程序嵌入了Python解释器并调用PyImport_Import来加载脚本。如何告诉它查找.pyc文件并导入它?
使用freeze工具,该工具包含在Python源代码树中的Tools/freeze目录下。它将Python字节码转换为C数组;通过C编译器,您可以将所有模块嵌入到一个新程序中,然后将其链接到标准Python模块。
请注意,freeze需要C编译器。
其他实用工具:
1- PyInstaller
2- Py2Exe
3- Squeeze
4- cx_freeze
我是通过创建 .py 库和简单的 .py 程序来完成的。然后我将库编译成了 .pyc 并进行了分发:程序作为 .py 源代码,库则作为已编译的 .pyc。
既然您的主程序是用C++编写的,您可以采取任何措施来保护您的Python文件。例如,您可以对其进行加密以进行分发,然后在导入到Python解释器时即时解密。
由于您正在使用PyImport_Import,因此可以编写自己的__import__
钩子来从内存缓冲区中导入模块,而不是从文件中导入,这样您的转换到.pyc文件的过程就可以全部在内存中完成,而没有任何可理解的Python代码存储在磁盘上。
$ echo 'print "hello"' > test.py
$ python -m compileall .
$ rm test.py
$ python -m test
hello
$
你能否尝试使用API测试一下是否可以达到同样的效果?
编辑补充: 我同意Ber的观点,你的代码保护措施可能会相对较弱。-O将删除docstrings,如果这不会改变程序的行为,那么可能会使重构行为更加困难,但你真正需要的是某种字节码混淆。
我不知道是否有现成的Python混淆工具,但是这个听起来是可行的,如果你愿意/能够投入时间(并且不觉得自己很傻),并且可以运行自己的解释器。
如果您使用py2exe创建一个独立程序,那么这不应该成为问题,您只会得到.pyc文件。
通常情况下,您无需告诉Python查找.pyc文件,它会在任何情况下都执行。只有当存在更新的.py源文件时才会使用。
但是,您的源代码保护级别可能并不是很高。