Skip to main content

Python 脚本打包为 exe

· 4 min read
Castamere
Code Aesthetic

经典问题之 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 的第一个参数
  • Analysisdatas 参数
  • EXEname 参数
main.spec
...
a = Analysis(['main.py'],
...
datas=[],
...)
...
exe = EXE(
...
name='main',
...)

Analysis 的第一个参数

这个参数是一个列表,里面的内容就是需要用到的代码文件,其路径都是相对于 spec 文件的路径。以上面的内容为例,格式如下:

a = Analysis(['main.py'],
...)

Analysisdatas 参数

EXEname 参数

Buy me a coffee ☕:
This article is licensed under CC 4.0 BY-SA