最近用Python给媳妇写了两个小项目,给解决了她的每天重复的一些人工操作。媳妇很开心,但是问题来了,她是个Python小白,对她来说,需要安装配置Python环境和一大堆第三方模块是个麻烦事儿。而且后续把这些工作交接给别人的话,一是又需要重新安装Python环境,二是我辛苦给她写的源码就这样暴露了。
为了解决这个问题,于是就开始百度。果然Python还是有好多中加密源码的方法,并且可能打包成exe的可执行文件。这样不仅保护了源码的安全,还免去了安装Python环境的繁琐。
最开始试了是py2exe这个模块,花了两个小时,还是没倒腾成功,百度查了说py2exe不是很好用,我也果断放弃了,尝试别的方法。然后就有了pyinstaller的经历。百度上有不少文档,但还是得自己去真正操作一遍才行。那我们就开始吧。
首先是安装pyinstaller模块,这个很简单,直接pip install pyinstaller就行了。我们就重点讲讲怎么用吧。先从最简单的开始。。。。
写个简单的脚本holle.py,为什么要在脚本的最后加上了time.splee(5)?因为生成的exe文件执行太特么快了,我都没看见打印了什么就自动关闭docs窗口了。
# -*- coding: utf-8 -*-
#2019/12/25 14:24
import time
print('#######################################################################################')
print('#######################################################################################')
with open('123.txt','r') as f:
ret = f.read()
print(ret)
print('#######################################################################################')
print('#######################################################################################')
print('#######################################################################################')
time.sleep(5)
这里简单介绍一下pyinstaller的参数使用:
| -h,--help | 查看该模块的帮助信息 |
|---|---|
| -F,-onefile | 产生单个的可执行文件 |
| -D,--onedir | 产生一个目录(包含多个文件)作为可执行程序 |
| -a,--ascii | 不包含 Unicode 字符集支持 |
| -d,--debug | 产生 debug 版本的可执行文件 |
| -w,--windowed,--noconsolc | 指定程序运行时不显示命令行窗口(仅对 Windows 有效) |
| -c,--nowindowed,--console | 指定使用命令行窗口运行程序(仅对 Windows 有效) |
| -o DIR,--out=DIR | 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件 |
| -p DIR,--path=DIR | 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径 |
| -n NAME,--name=NAME | 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |
在表 1 中列出的只是 PyInstaller 模块所支持的常用选项,如果需要了解 PyInstaller 选项的详细信息,则可通过 pyinstaller -h 来查看。
打开终端,进入到hello.py的所在目录,执行 pyinstaller -F hello.py。执行完会自动生成build、dist目录和hello.spec文件。
咱要的exe文件在dist目录下,其他的就没有用了。直接把dist目录下的 hello.exe文件拷贝到其他地方,比如桌面,哈哈。然后在桌面创建一个123.txt文件,随便写点什么。主要测试一下exe能否正常执行,有没有打印预期的内容。试了一下,不错。是预期的效果。那接下来就可以开始我们的正题了。打包多个目录下的多个py文件。
代码目录结构如下:
1、先生成spec文件
打开Terminal,进入到bin目录下,执行pyinstaller -D run.py,还是一样执行完会自动生成build、dist目录和run.spec文件。让我们来看看spec文件长啥样。
2、配置spec文件
因为项目里写了好多自定义的模块,以及应用的图片和模板文件。所以需要配置一下spec文件,才能正确的生成exe文件。
主要配置以下4个地方即可:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None SETUP_DIR = 'E:\\python_test\\python\\lixiaoxin_barcode2' a = Analysis(['run.py', 'E:\\python_test\\python\\lixiaoxin_barcode2\\core\\main.py', 'E:\\python_test\\python\\lixiaoxin_barcode2\\conf\\settings.py', 'E:\\python_test\\python\\lixiaoxin_barcode2\\core\\barcode_handler.py', 'E:\\python_test\\python\\lixiaoxin_barcode2\\core\\log.py'], pathex=[SETUP_DIR], binaries=[], datas=[(SETUP_DIR + '\\db\\input','db\\input'),(SETUP_DIR + '\\doc','doc')], hiddenimports=['core','core.main','conf.settings','core.log','core.barcode_handler'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='run', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='run')