Python-python打包编译成pyd或者.so,保护代码。
2020-05-20
参考:https://blog.csdn.net/qq_39852676/article/details/99842637
https://blog.csdn.net/qq_39852676/article/details/99745224
https://blog.csdn.net/kdongyi/article/details/102678595
一、首先为什么要使用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):
from setuptools import setup # from distutils.core import setup from Cython.Build import cythonize setup( name='py2c', # 打包文件的名称,默认与py2c.py在同一路径下 ext_modules=cythonize('mytest.py'), )
或者代码(文件名py2c_2.py):
# -*- coding: utf-8 -* from distutils.core import setup from Cython.Build import cythonize def py2c(file): # 返回distutils.extension.Extension对象列表 cpy = cythonize(file) setup( name = 'pyd的编译', # 包名称 version = "1.0", # 包版本号 ext_modules= cpy, # 扩展模块 author = "zc",#作者 author_email='xxx@xxx.com' #作者邮箱 ) if __name__ == '__main__': file = "mytest.py" py2c(file)
如何执行:
在命令行执行如下代码:
python py2c.py build_ext --inplace
# 或者
python py2c_2.py build_ext --inplace
这两段代码生成的文件不太一样。
在Windows平台执行结果:
生成如下文件:
在Linux平台执行结果:
生成如下文件:
第一个运行python py2c.py build_ext --inplace的结果
第二个运行python py2c_2.py build_ext --inplace的结果
具体如下:
三、使用pyd/so库文件
在命令行输入:
python
我用的是
python3
然后导入我们生成的库文件模块:
import mytest mytest.main() mytest.test()
注:mytest.main() 其中main()为mytest.py中的一个函数。
结果:
————————————————
版权声明:本文为CSDN博主「清晨的光明」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kdongyi/article/details/102678595
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构