python用pyinstaller打包后路径问题

用pyinstaller打包python程序后发现要读取的文件路径不对了,解决方法如下:

	if getattr(sys, 'frozen', False):
		absPath = os.path.dirname(os.path.abspath(sys.executable))
	elif __file__:
		absPath = os.path.dirname(os.path.abspath(__file__))

列出该文件夹下的文件

fileList = os.listdir(absPath)

目标文件完整路径

ruleFilePath = os.path.join(absPath,ruleFile)

记录一下pyinstaller打包的方法:

在你想放置应用的文件夹下打开cmd,pyinstaller + 参数 +文件入口或打包定义文档。

参数: 

参数含义
-F打包单个文件,生成结果是一个exe文件,如果代码都写在一个.py文件时使用,项目有多个文件时不要使用
-i指定程序的图标
-w不显示dos窗口(命令行)
-c显示dos窗口(命令行)
-h显示帮助
-v显示版本号
--key=密码加密打包

 更换exe程序图标

        如果不喜欢默认的图标,想要换成自己喜欢的,那么需要准备后缀为.ico的图片。在网页上就可以在线转图片格式,很方便。
        执行命令:pyinstaller -F -i 图片名.ico 文件名.py。(-i表示更换图标) 

pyinstaller -F -i D:\target.ico main.py

去掉Dos窗口

如果程序本身就实现了图形界面,运行程序的时候,不希望显示dos窗口,想取消掉就执行-w命令。再重新打包后,就会只显示图形界面,没有dos窗口了

pyinstaller -F -w main.py -i D:\target.ico 

如果打包出来的exe文件比较大,可以用upx进行exe压缩

1,去官网下载upx的exe文件

https://github.com/upx/upx/releases/download/v4.1.0/upx-4.1.0-win64.zip

 2,将upx.exe放到python目录下

将图片ico资源打包进exe

 如果是正常打包还需要将图片等资源放到exe的文件夹下,这样在某些情况下会不方便,那能不能把图片资源也一起打包进exe呢

我们可以使用pyinstaller的--add-data参数,将assets文件夹里面的资源嵌入到exe文件中。

资源嵌入exe只在单文件模式下使用。文件夹模式下,资源文件夹不会嵌入到exe中,但是会被复制到exe所在的文件夹。

使用资源嵌入后,资源文件夹的路径发生了变化,我们不能使用一般的相对路径来调用assets这样的内嵌资源文件夹。

前面已经讲过,pyinstaller单文件模式下的exe启动后,会将嵌入的资源文件放到一个临时的文件夹中,这个文件夹的名字不是固定的,叫做_MEIxxxxx,其中xxxxx是随机数。这个文件夹的路径在打包后会被放到sys._MEIPASS这个变量里面,只需要调用sys._MEIPASS就可以获得这个路径文件夹。

于是,我们通过以下函数返回正确的路径:

def get_path(relative_path):
    try:
        base_path = sys._MEIPASS # pyinstaller打包后的路径
    except AttributeError:
        base_path = os.path.abspath(".") # 当前工作目录的路径
 
    return os.path.normpath(os.path.join(base_path, relative_path)) # 返回实际路径

命名如下:

pyinstaller -F -w -i dpi.ico --add-data ico;ico IOTExcelToMML.py

启动画面

 pyinstaller单文件模式启动速度较慢,所以可能需要一个启动画面(闪屏)进行过渡,提示用户正在进行加载。这个启动画面可以是单张图片,也可以是文本

支持闪屏,需要先准备一张图片,必须是PNG格式(如果你安装了pillow模块,可以用pillow模块支持的其他格式)。然后,在打包时加上--splash参数,并传入图片路径

pyinstaller -F -w -i dpi.ico --add-data ico;ico IOTExcelToMML.py --splash start.png

控制闪屏可以通过pyi_splash模块,这个模块和上一节的sys._MEIPASS属性一样,在没有通过pyinstaller打包成exe后是不起作用的,所以必须带上try...except...代码。

pyi_splash.close()方法用于关闭闪屏。一般放在程序开头即可,因为只要运行到程序开头,说明pyinstaller的加载就基本完成了。

于是,在程序开头部分添加以下代码:
 

try:
    import pyi_splash
    pyi_splash.close()
except ImportError:
    pass

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ftzchina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值