如何加密并发行你的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

使用pythondistutils工具来翻译并编译改代码,将一下代码保存成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

Written on March 13, 2018 Author: CINQS