加密Python代码,可以将其编译为.c
文件,然后转换为.so
下面这个例子就是加密run1.py
文件的全过程
- 首先,建立
compile.py
文件
from distutils.core import setup
from Cython.Build import cythonize
setup(name='run1app',
ext_modules=cythonize('run1.py'))
以及run1.py
文件,里面用main()作为调用入口
def main():
print(123)
- 命令行中执行
python compile.py build_ext --inplace
这里会生成一个文件run1.cpython-37m-x86_64-linux-gnu.so
- 将文件改名为run1.so,<font color='#ff0000'> 要注意,.so文件名必须和.py的相同!</font>否则会报错,报错内容为
ImportError: dynamic module does not define module export function
! mv run1.cpython-37m-x86_64-linux-gnu.so run1.so
- 执行这个python文件,可以用下面语句
! python -c "from run1 import main;main()"
编译多个文件,那么compile.py
改为
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("run01", ["run1.py"]),
Extension("run02", ["run2.py"]),
# ... all your modules that need be compiled ...
]
setup(
name = 'test123',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
执行下列命令即可
python compile.py build_ext --inplace
可以看到,Extension
里面有run01
和run02
两个字符串,代表最终生成的名字,所以<font color='#ff0000'> .so文件名必须和对应的run01以及run02的相同!</font>
最后要注意,重新生成的时候,要运行下面语句来删除之前的.c
和.so
文件
rm *.c
rm *.so