近期写了一个Python程序,但是不想把源码公开,于是在网上查询相关资料,发现可以通过生成pyd文件,最后打包成exe执行程序的方式,尽可能地防止反编译。

一. 简介

本文章内容适合windows开发环境,简单介绍一下接下来会涉及到的东西。

  • PyInstaller: 是一款用于将pyhon程序打包成exe文件的工具。
  • Cython:是用Python实现的一种语言,可以用来写Python扩展,用它写出来的库都可以通过import来载入,性能上比Python的快。
  • pyd文件:我们都知道,.py是编写好的源代码,而.pyc是编译好的字节码,.pyd则是一种python动态模块,实质上是一种dll文件。

二. 安装PyInstaller和Cython

我们可以通过pip来安装。

  • 安装PyInstaller:pip install pyinstaller
  • 安装Cython:pip install Cyphton

然后记得配置环境变量,确保命令行能执行pippyinstallercython命令。

三. 开始打包

假设我们已经写好了一个python文件,名为course.py,接下来我们就可以开始打包了。

第一步:先将python中引用的第三方库或包对应的文件(夹)复制到当前目录。

第二步:在当前目录创建一个setup.py文件,内容如下。

1
2
3
4
5
6
7
from distutils.core import setup
from Cython.Build import cythonize

setup(
name='填写名称,目前还没发现有什么用途',
ext_modules=cythonize(["course.py", ]),
)

第三步:生成pyd文件,执行下列命令。

1
python setup.py build_ext --inplace

到这里,文件夹中会出现一个名为course.cp37-win_amd64.pyd的文件,可将其改名为course.pyd

第四步:在当前目录创建一个index.py文件,内容如下。

1
2
3
# 这里把course.py中用到的库复制过来

import course # 这里引用源代码

第五步:打包

1
pyinstaller.exe -F .\index.py -i .\s.ico

-F指定只生成一个exe文件,-i指定exe的图标,其他参数可以自行查询。

最后,exe文件会生成在当前目录下的dist文件夹中。

四. 相关报错

1. 生成pyd文件时无法找到vcvarsall.bat文件

报错:Unable to find vcvarsall.bat

查阅网上资料,大部分说的是VC环境问题,我的环境是Visual Studio 2019,Python3.6。

两个解决方法:

① 卸载Visual Studio和Python3.6,安装Visual Studio 2017,选装 Anaconda3、Python本机开发工具,然后重新配置Python环境。

② 略过生成pyd文件这一步(直接对源文件打包),但是这样打包出来的exe容易被反编译。

2. pip版本过低,需要升级

如果遇到pip版本过低,可能会遇到错误:You are using pip version 10.0.1, however version 20.0.2 is available

解决方法:执行下列命令升级pip(注意要使用管理员身份进入cmd执行)。

1
python -m pip install --upgrade pip -i https://pypi.douban.com/simple