pyinstaller网上一堆教程,却很多看的云里雾里的。踩完坑来写一下。没有废话。
-D 生成有文件夹的程序(推荐,方便排错)
-w 无控制台模式(有时候没什么卵用,还是有控制台,跟打包的系统有关系)
找到运行的主文件main.py,运行:
pyinstaller -D -w main.py
如果项目有很多文件夹而不是单个的py的文件,打包通常不能一次完成,需要编辑运行生成的main.spec文件,编辑完运行 pyinstaller main.spec
main.spec部分内容:
a = Analysis(
['main.py'],
pathex=["D:\Documents\Downloads\myProject"],
binaries=[],
datas=[('a.html','.'),('b','.'),('folder/*','folder')],
hiddenimports=["PyQt5.sip"],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
a.datas=a.datas+Tree("./static",prefix='static')+Tree("C:/Users/Administrator/AppData/Local/Programs/Python/Python37/Lib/site-packages/py2neo",prefix="py2neo")+Tree("C:/Users/Administrator/AppData/Local/Programs/Python/Python37/Lib/site-packages/jieba",prefix="jieba")
跟main.py同目录的文件,或者目录下面只有一层文件的,可以在datas里面手动写文件。
datas下导入的并不是整个文件夹内的东西,它只是根据选择去导入。如果有个static的文件,里面是一堆不同开源项目的js或者css的包,想原封不动的导入那只能用Tree。
pyinstaller最常见的问题是打包完,运行说缺少这个,缺少那个,最省事的方法是到/Python/Lib/site-packages/里找到那个包,然后整个路径写到Tree里面。
如果打包遇到permit error,终端已经是管理员权限的话,就把python文件夹的权限改一下,把[只读]后面的勾去掉。