因为pyinstaller打包会将环境里所有包都打包进去,所以生成的文件会特别大。为了避免这个问题,新建一个虚拟环境并且只安装项目依赖的包和必须的包。以下指令全在控制台执行。
为了尽量减少新环境中包的数量首先在随便一个环境下使用pipreqs包来获取项目依赖的包:
pip install pipreqs //安装pipreqs包
cd [项目根目录]
pipreqs ./ --encoding=utf-8 //不输入后面的encoding可能会出bug
requirements.txt会被保存在项目根目录下。
然后创建虚拟环境并安装依赖包:
conda create -n name python=[所需的版本] //创建虚拟环境
conda activate name //进入虚拟环境
pip install -r requirements.txt //在该环境下安装所需包
安装pyinstaller包:
pip install pyinstaller==6.2.0 //直接下6.3.0会提示有病毒打包不了或者打包了打不开
先生成spec文件:
pyinstaller [主程序的py文件,示例:main.py]
打开spec文件修改:(不要直接新建文件复制粘贴,生成的文件里还会有别的内容)
a = Analysis(
//在这个框里将import的其他py文件全放进去,在根目录下直接写文件名,不在根目录写绝对路径
['main.py','other.py','D:/project/1/another.py'],
pathex=[],
binaries=[],
//其他文件放这里,一个绝对路径一个相对路径的文件夹(直接在目录下则为'.')一组,注意别忘了括号
datas=[('D:/project/1.txt','.'), ('D:/project/a/2.txt','a')],
//如果有报错某包不存在就写在这,我实践没有碰到这个问题
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='main', //可执行文件名
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False, //是否显示控制台黑框
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
如果使用datas打包了素材,需要修改使用素材路径,添加以下代码,将原本的素材路径修改为调用该函数,传入相对路径。如果不修改路径,则项目路径为exe所在目录。
def get_resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
get_resource_path('res/yaya.ico')
修改完保存,在控制台输入:
pyinstaller [spec文件名,示例:main.spec]
看到以下内容就是已经完成打包:
在项目根目录中会多出两个文件夹:其中build文件是构建过程中的临时文件,可以删除。我们生成的文件在dist中
下面是可执行文件,上面是依赖项,将这两个文件一起打包到其他电脑上可以运行,注意一定要这样在一个文件夹里才能运行。