如何加密并发行你的python代码
1. 将py
文件编译成.pyc
文件
python compileall module 是python安装时自带的模块,使用如下命令可以将你的py
文件
编译成pyc
文件
python -m compileall ./ #将当前文件夹下的所有的文件编译成字节码
编译成的字节码会被放在一个名为 __pycache__的文件夹下,编译后的字节码文件的使用办法和py
文件一致
注意: 这样编译的字节码很容被反向工程破解,仅仅会给尝试阅读代码的人制造困难而已。另外,在编译后的pyc
代码中,shebang是不可用的(也有曲折的办法使用)可以使用这里面提到的两种工具反编译 .pyc
文件 https://stackoverflow.com/questions/5287253/is-it-possible-to-decompile-a-compiled-pyc-file-into-a-py-file
2. 重构你的代码,使用a,b,c等并不包含实际意义的变量名
这种方法经常见于JavaScript
的代码中,这样的好处是可以降低文件大小,降低网络IO负担,也可以起到加密作用。
如果想尝试这种办法,有一个叫pyminifier的模块可以尝试下
注意:这种办法会增加你后期维护的成本,是属于杀敌一千自损八百的办法
3. 使用cython来将你的核心代码转换为机器码
cython
的功能是将你的python
代码翻译为C
语言码,然后还可以编译成机器码。因为python
可以直接import
C
的机器码(so
文件等),因此你的使用办法
不会变
注意: cython
不是完美的,会给你的程序,项目带来很多的潜在的麻烦。建议仅编译一些已经定性的算法部分,对外屏蔽算法部分的实现细节。将算法做成API的接口
Cython
实现起来非常简单
下面是一个示例:
例如你的算法代码是一个斐波那契数列生成器,将下面的代码保存成 fib.py
文件
def fib(n):
a, b = 0, 1
while b < n:
print(b)
a, b = b, a + b
使用python
的distutils工具来翻译并编译改代码,将一下代码保存成setup.py
文件
你也可以使用 gcc等自行编译C码
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize('fib.py') # 'fib.py is the relative path to the file that will be translated and compiled'
# here lists all the files those would be cythonized
)
然后执行以下命令
$ python setup.py build_ext --inplace
然后你会在fib.py
文件同目录下发现 fib.*****.so/pyd/dll
文件。该文件即是机器码形式的库文件
调用该库文件和常规的python
调用库文件一致(也可以简单的将该库文件拷贝到你的PYTHONPATH
目录下,也可以是你的运行代码的同目录下)
>>> import fib
>>> fib.fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
– 原文地址:cython.readthedocs