赞
踩
用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目录下
如果是正常打包还需要将图片等资源放到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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。