加密Python代码,可以将其编译为.c文件,然后转换为.so

下面这个例子就是加密run1.py文件的全过程

  1. 首先,建立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)
  1. 命令行中执行
python compile.py build_ext --inplace

这里会生成一个文件run1.cpython-37m-x86_64-linux-gnu.so

  1. 将文件改名为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
  1. 执行这个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里面有run01run02两个字符串,代表最终生成的名字,所以<font color='#ff0000'> .so文件名必须和对应的run01以及run02的相同!</font>

最后要注意,重新生成的时候,要运行下面语句来删除之前的.c.so文件

rm *.c
rm *.so
最后修改:2021 年 06 月 01 日 02 : 31 PM
如果觉得我的文章对你有用,请随意赞赏