python用pyinstaller打包后路径问题 您所在的位置:网站首页 aspera插件安装后找不到文件所在位置 python用pyinstaller打包后路径问题

python用pyinstaller打包后路径问题

2023-11-19 08:23| 来源: 网络整理| 查看: 265

用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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有