Python pyd文件的制作和编译,以及程序源代码的保护

在Python程序开发后, 有可能想要保护程序的源代码, 避免被uncompyle6等库反编译。

pyd文件是什么

pyd文件类似于DLL, 一般用C/C++语言编译而成, 可用作模块导入Python程序中。
示例:

>>> import _tkinter # 导入pyd文件
>>> _tkinter.__file__
'D:\\...\\_tkinter.pyd'

pyd文件用C/C++语言编译而成, 难以被反编译, 在保护Python程序源码上有很好的效果。
而且由于使用了C/C++等低级语言, 代码执行效率较高。
另外,pyd文件仅适用于特定版本的Python, 不同版本间互不兼容, 如Python3.8不支持3.7版本的文件。

安装Visual Studio C编译器

未安装C编译器时, 编译pyd会出现报错。
你可以使用Visual Studio的C编译器, 或MinGW编译器。由于Visual Studio的C编译器安装方便, 而MinGW较复杂, 这里介绍安装Visual Studio的方法。
所需文件: pan.baidu.com/s/1V2yexz7q0UKChizMb33qxg?pwd=spmq
启动VisualStudioSetup.exe, 必须选择C++开发, 可选Python开发, 点击安装。
安装解说-1
等待安装完成。
安装解说-2
Visual Studio虽然体积较大, 但包含了比较完备、全面的C/C++编译器及其他工具, 适用于Windows平台。

方法1: 从py文件生成pyd文件 (常用)

制作pyd文件有两种方式, 一种是通过已有的.py文件(或已有的C语言代码)生成, 另一种是编写C/C++代码, 再编译成pyd文件。
通过已有的.py文件生成pyd文件, 需要使用distutils模块, 和Cython库。安装Cython, 可使用pip install cython
test.py

def main():
    print("Hello world from pyd file!")

main.py

import test
test.main()

以下是生成pyd文件的主程序:

from distutils.core import setup
from Cython.Build import cythonize
import sys,os,traceback

setup(
    name = 'test',
    ext_modules = cythonize('test.py'),
)

程序目录下会生成一个.c文件, 包含了pyd文件所用到的C语言代码。
将生成的pyd文件重命名为test.pyd(也可能不需要重命名), 运行main.py, 就可以看到pyd文件中的结果了。
使用PyInstaller等库打包exe的时候, 先打包main.py作为主程序。即使exe被某个库反编译, 得到的只是主程序main.py, 而pyd文件中的代码是很难被反编译的。
结果

方法2: 编写C/C++代码, 编译成pyd文件

还是打开Visual Studio 2019, 创建新项目, 选择Python扩展模块为项目类型, 输入项目名称, 并选择项目所在的文件夹。

如果找不到这个项目, 点击"继续但无需代码", 打开菜单"工具" -> “获取工具和功能”, 添加一个Python开发的功能。

等待几秒创建完成后, VS2019会自动生成pyd文件的初始C语言代码。编写完成后, 打开菜单 “生成” -> “生成xxxx”, 就可以在项目所在文件夹的\Debug目录下找到生成的pyd文件。使用"调试"菜单中的调试命令, 或者按F5键, 就可以直接调试pyd文件。

总之, pyd文件无论在安全性, 还是在执行效率上, 都高于普通py文件。pyd文件经常被用于保护源码, 以及编写性能高的Python扩展。

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qfcy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值