https://pyinstaller.readthedocs.io/en/stable/spec-files.html
先上官网
官网写了两种打包静态文件的方法,一种是通过spec文件,一种是直接命令行打包
官网只写了这部分,没有python调用的部分,实践中一直找不到静态文件
后来发现,打包后调用的路径不能用当前路径了
例子:
完整程序如下,调用一个a.txt
# a.py
import os
import sys
if getattr(sys, 'frozen', None):
basedir = sys._MEIPASS # 打包后用的这个路径
else:
basedir = os.path.dirname(__file__) # 直接运行的时候用的这个
# 通过这种写法就可以实现打包和当前调试都可以运行
with open(os.path.join(basedir, 'a.txt'), 'r', encoding='utf-8') as f:
d = f.read()
print(d)
# a.txt
1
2
3
执行 pyinstaller -Fw a.py
生成了build 和dist和.spec 文件
直接运行报错
因为还没有添加静态文件 修改spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['a.py'],
pathex=['E:\\all_project\\test_pyinstall'],
binaries=[],
datas=[('./a.txt', '.')],
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='a',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True)
这里我修改了datas 和最后的console,设置console是为了看到print
最终成功
二: 打包大小测试
只import 了 os,sys 打包后结果为6M多点
目前虚拟环境中 只安装了 pyinstaller,无其他任何包
然后安装了pandas,不import测试,打包后结果和之前一样, 说明即使虚拟环境有其他包,只要不导入是没有影响的
测试from pandas import read_csv ,和import pandas 打包后的大小是否不同
增加了一句 import pandas
直接变成了232M
改成 from pandas import read_excel,结果依然是232M