Python 脚本打包为 exe
· 4 min read
经典问题之 Python 脚本打包为 exe/bin
缘起
最近来的一个任务,要写一个脚本获取某个 API 下所有的设备数据,且最后的脚本是要给一线使用。需要打包成 exe 文件(本来一行命令能解决的事)
之前也使用 Pyinstaller 打包过,现在还是系统性写一下
虚拟环境
建议大家在打包前,单独为其创建一个虚拟环境,这样打包出来的文件就不会有依赖问题,也不会打包过多无用库,造成打包文件过大
如果没有安装过 conda,可以参考 miniconda 的安装与使用 这篇
安装
conda install pyinstaller
使用
命令的基本用法如下,main.py 是你要打包的文件名,如果代码较短,仅有一个文件的情况下,直接像下面这样打包即可
pyinstaller -F -w -i "icon.ico" main.py
-F
表示打包成单个文件-w
表示不显示控制台窗口-i
表示指定图标
info
在 windows
下会自动打包为 exe
文件,在 linux
下会打包为 bin
文件,都会储存在 dist
文件夹下
项目打包
前面适用于单个文件打包,如果是一个项目,包含多个文件的情况下,接下来慢慢讲
假设你的项目结构如下:
首先,正常来说,你的代码应该有一个入口,也就是 python 执行的文件,以 main.py
为例。然后会有一些依赖的代码文件,比如 readconfig.py
。最后还会有一些数据、配置文件,比如 config.ini
,而且这类文件可能部署后也会被修改
第一步仍然是 pyinstaller -F main.py
,但这次的作用不是打包,而是生成一个同名的 spec
文件
生成的 spec 文件内容如下:
important
是否使用 -F,会导致生成的 spec 文件结构不同,这里不深入了,后面再写一篇详细讲
main.spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['/home/casta/project'],
binaries=[],
datas=[],
hiddenimports=[],
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
这里只讲一下会用得到的内容,基本上就是下面的三条:
Analysis
的第一个参数Analysis
的datas
参数EXE
的name
参数
main.spec
...
a = Analysis(['main.py'],
...
datas=[],
...)
...
exe = EXE(
...
name='main',
...)
Analysis
的第一个参数
这个参数是一个列表,里面的内容就是需要用到的代码文件,其路径都是相对于 spec
文件的路径。以上面的内容为例,格式如下:
a = Analysis(['main.py'],
...)