Python源代码保护(Python文件编译生成pyd/so库文件)

  • Post author:
  • Post category:python

一、首先为什么要使用pyd文件?

        我们知道Python是一门解释型语言,当我们想让其他人运行我们的代码时,如果直接将.py源代码发送给他人,那么源代码将没有任何安全性可言,也就是任何一个人都可以打开源代码一看究竟,任何人都可以随意修改源代码。因此当我们想保护我们的源代码(算法保护)或者防止用户篡改源代码时,可以将Python源代码编译生成.pyd库文件或者.so库文件(Windows平台生成pyd文件,Linux生成so文件)。

事实上,Python和Java的解释方式是相同的,只是我们表面上看Python是直接解释源代码,而实际上python解释器只会加载字节码。细心的小伙伴肯定发现了这一点,当我们import某个模块时,总是会在模块所在的目录创建一个__pycache__目录,里面存放着被加载模块的字节码文件。

Python有以下几种类型的文件:

  • py:Python控制台程序的源代码文件
  • pyw:Python带用户界面的源代码文件
  • pyx:Python包源文件
  • pyc:Python字节码文件(可通过逆向编译来得到源码)
  • pyo:Python优化后的字节码文件(可通过逆向编译来得到源码)
  • pyd:在Windows平台上Python的库文件(Python版DLL)
  • so:在Linux平台上是so文件

二、生成pyd/so库文件

代码(文件名py2c.py):

import Cython.Build
import distutils.core

def py2c(file):
    cpy = Cython.Build.cythonize(file) # 返回distutils.extension.Extension对象列表

    distutils.core.setup(
	    name = 'pyd的编译', # 包名称
	    version = "1.0",    # 包版本号
	    ext_modules= cpy,     # 扩展模块
	    author = "kdongyi",#作者
	    author_email='kdongyi@163.com'#作者邮箱
	)

if __name__ == '__main__':
	
    file = "train_gpu.py"
    py2c(file)

如何执行:

  在命令行执行如下代码:

python py2c.py build_ext --inplace

在Windows平台执行结果:

生成如下文件:

在Linux平台执行结果:

生成如下文件:

三、使用pyd/so库文件

 在命令行输入:

python

然后导入我们生成的库文件模块:

import train_gpu
train_gpu.main()

注:train_gpu.main()  其中main()为train_gpu.py中的一个函数。


版权声明:本文为kdongyi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。