py文件打包 exe时遇到的路径问题
(本文部分引用自https://www.cnblogs.com/technicianafei/p/16068438.html)
路径“冻结”
pyinstaller 打包py文件成exe文件,在没有python的机器上运行,执行打包后的程序,经常会出现程序使用的图标无法显示,程序使用的关联文件无法关联。或者,在打包的本机上运行正常,但是将打包后的程序放到其它机器上就有问题。这些现象都很有可能是由程序使用的文件路径发生改变产生的,因此在打包时候我们需要根据执行路径进行路径“冻结”
文件路径:
绝对路径:从整个硬盘出发开始表述的路径,例如:C/D/E:/***/***/...
相对路径:从当前编辑文件出发表述的路径,不同语言表示方法有差异,例如:./***/***,或../***/***/...
打包exe发布过程中路径出现问题的原因主要有:
1.文件路径使用了绝对路径,本地没问题,其他机器基本不可能没问题。需使用frozen 方法解决。
(在python代码中使用绝对路径调用外部文件可以保证打包时候路径可追溯,因此在本机上运行打包后程序基本没问题。但是当本机上对应路径的资源文件被改变,或者将打包程序应用到别的机器,都会出现搜索不到资源文件的问题。这种方式不是合适的打包发布python软件的方式。)
2.打包后dist文件夹内没有文件,属于格式错误,dist内加入相应文件就可解决。
3.exe文件存放路径包含了desktop, 需更改exe存放位置。
以下是整个的大概解决过程:
打包命令:
pyinstaller -F -w -i 图标名.ico 文件名.py
frozen 方法:
新建一个frozen_dir.py文件
import os, sys
def app_path():
"""Returns the base application path."""
if hasattr(sys, 'frozen'):
# Handles PyInstaller
return os.path.dirname(sys.executable)
return os.path.dirname(__file__)
然后再主文件中,引用frozen_dir模块创建相对路径
例如:file_path= frozen_dir.app_path() + r'/1.ico'
其中的app_path()函数返回一个程序的执行路径,为了方便我们将此文件放在项目文件的根目录,通过这种方式建立了相对路径的关系。
源代码中使用路径时,会以app_path()的返回值作为基准路径,其它路径都是其相对路径。以本文中使用的python项目打包为例,如下所示: test.py
(frozen 文件)
使用 frozen 方法,本地py文件运行成功
第一次错误:py文件根目录下没有图标文件,打包失败
加入后打包成功
第二次错误:本地dist文件夹没有图标文件,exe运行失败
本地dist文件夹加入图标文件,exe运行成功
第三次错误:其他电脑exe路径含桌面运行失败
其他电脑exe路径不含桌面运行成功
文件树:
file/dist/img/***
file/dist/*.exe
ffile/build/***
file/*.espc