当前位置:网站首页>Pyinstaller打包exe附带图片的方法
Pyinstaller打包exe附带图片的方法
2022-07-02 12:15:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
2019.10.27更新
在最近的wordpress项目中学到了图片字节码可在文件中存在,于是我做了试验并成功了(就是代码里带一堆字节码……)
参考:
https://blog.csdn.net/jss19940414/article/details/85841982
https://www.cnblogs.com/xianqingsong/p/9965899.html
https://blog.csdn.net/u013055678/article/details/71406746
这是将路径下图片编码再解码保存的例子:
import os, base64
with open("D:\\XiutuDog\\_pic.png","rb") as f:
# b64encode是编码,b64decode是解码
base64_data = base64.b64encode(f.read())
print(base64_data)#输出生成的base64码
#img_str = 'abcdefgh12345oK='#比如生成后的码就这么放,替换下面的base64_data即可
img_data = base64.b64decode(base64_data)
# 注意:如果是"data:image/jpg:base64,",那你保存的就要以png格式,如果是"data:image/png:base64,"那你保存的时候就以jpg格式。
with open('001.png', 'wb') as f:
f.write(img_data)
把经过编码后的base64_data(输出的)放在代码里,再解码写到文件夹里实现“释放”【在被注释的img_str哪里】,虽然方法比较笨,但是这是实在的“exe附带图片”!
2018.10.13附加
原来下面这个方法是把图片存到绝对路径了(存同文件夹是相对路径……),所以放哪都能用……现在没卵用,我再去找方法吧……
pyinstaller打包运行报错failed to execute script main(也有可能是图片路径没找到):https://blog.csdn.net/jeff_/article/details/72907113
原文:
毕设写的工具最近才想起来应该做成个exe造福大众,奈何路途曲折
先是vs直接装的pyinstaller不管用;后是不知如何打多个文件的项目(最后写在一个.py里了……还有import的包尽量减少了);最后是图片文件不会打包在一起,让我有种擦屎擦不干净的不爽的感觉——一个小exe还必须和几个固定命名的图片在一个文件夹内不然打不开!!
今天看了看了不少帖子,方法有的简单但是不成功;有的麻烦,要改的东西有点多就不想尝试;最后看着错误提示加思考终于成功的打了个exe!
pyinstaller的安装:
参照(很好的帖子)https://blog.csdn.net/lqzdreamer/article/details/77917493
单个exe啥也不用的话,下面的命令就够了。
pyinstaller -F test.py
打包python 加icon 去掉cmd黑窗口 https://blog.csdn.net/frank_good/article/details/60962012
python pyinstaller.py -F -p C:\python27; -i .\xxx.ico .\demo.py --noconsole
接下来介绍打包图片的方法。
开始是参考https://blog.csdn.net/qq744746842/article/details/49404027的,但是后来尝试失败,
pyinstaller options name.spec
这句代码执行不了啊……
本教程完整过程开始:
生成spec文件:
这是我要打包的东西。(接下来的文件名都参照这个)
然后cmd到这个目录,(我是当前文件夹直接按住shift+右键,单击“在此处打开powershell窗口”,效果一样还方便)
在cmd里输入 :
pyi-makespec FP.py
会生成一个FP.spec
然后改FP.spec里面的东西,下面是原样
直接打这个文件的包出来的是……如下,我可不想把工具做的这么复杂……
接下来就是改里面的东西,(如果不想用这种办法,另一种是https://blog.csdn.net/jirryzhang/article/details/78881512里的是用指令来做,而且直接是单个exe)
.py图片引用完整路径
改之前,需要把你python程序里的所有的图片引用换成完整的路径:
代码里就这么用图片喽……
此方法有参照http://tieba.baidu.com/p/3060401749的第6楼(看他jia加的函数,就是获取完整路径而已),再加再一篇帖子里看到“pyinstaller不是将代码编译,而是将脚本弄成可以执行的文件,所以别想能打包后程序变快”,由此猜想到“图片需要完整路径,spec文件里也要写上完整路径,这样就能让这个exe‘接轨’运行起来”
开始改spec文件:
方法有参考 https://blog.csdn.net/xinyingzai/article/details/80282856,
但是datas并不是datas+=[(‘_pic.png’,’D:\\XiutuDog\\_pic.png’,’DATA’)],会报错“expected tuple,not list”,
于是我是这么改的datas+=((‘_pic.png’,’D:\\XiutuDog\\_pic.png’,’DATA’))
红框是三张我需要的图片,格式是 ((‘名字1′,’1的完整路径’,’类型’),(‘名字2′,’2的完整路径’,’类型’))
左边的橙色箭头是是否显示控制台的cmd黑框
右边的橙色箭头是加上去的,可以给自己的exe换图标【但是离开文件夹就不是这个图标了,现在还没解决】
全文如下:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['FP.py'],
pathex=['D:\\XiutuDog'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas +=(('_icon.ico','D:\\XiutuDog\\_icon.ico','DATA'),
('_pic.png','D:\\XiutuDog\\_pic.png','DATA'),
('_start.png','D:\\XiutuDog\\_start.png','DATA'))
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[('_icon.ico','D:\\XiutuDog\\_icon.ico','DATA')],
name='FP',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False , icon='_icon.ico')
开始打包
与通常不同,这次的对象是之前改过的.spec文件,而不是.py文件
pyinstaller -F FP.spec
有个坑:如果刚改完.spec,手贱打了个 pyinstaller -F test.py ,那么.spec文件可就被改成默认的了!
完成后应当是这样的(FP.exe是从dist文件夹复制出来的,【dist文件夹内就是打包好的exe】)
那个exe,离开了图标所在的文件夹可能会变回原来的默认图标,一会儿后会恢复……
但是无论如何,可以脱离图片运行了o(* ̄▽ ̄*)ブ
部分其他参考
https://blog.csdn.net/xueyuanlzh/article/details/79892968
https://blog.csdn.net/lion_cui/article/details/51329497(图片转py,觉得麻烦,没用它)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147721.html原文链接:https://javaforall.cn
边栏推荐
- 【LeetCode】977-有序数组的平方
- [leetcode] 1254 - count the number of closed Islands
- 6095. 强密码检验器 II
- [leetcode] 1020 number of enclaves
- 树-二叉搜索树
- MySQL -- Index Optimization -- order by
- Build your own semantic segmentation platform deeplabv3+
- [network security] network asset collection
- [leetcode] 876 intermediate node of linked list
- How to intercept the value of a key from the JSON string returned by wechat?
猜你喜欢
Equipped with Ti am62x processor, Feiling fet6254-c core board is launched!
【网络安全】网络资产收集
How to find a sense of career direction
How to intercept the value of a key from the JSON string returned by wechat?
微信支付宝账户体系和支付接口业务流程
. Solution to the problem of Chinese garbled code when net core reads files
Basic knowledge of cryptography
Redux——详解
Party History Documentary theme public welfare digital cultural and creative products officially launched
【LeetCode】1162-地图分析
随机推荐
【LeetCode】695-岛屿的最大面积
Oracle primary key auto increment
/bin/ld: 找不到 -lcrypto
Cultural scores of summer college entrance examination
03. Preliminary use of golang
[experience cloud] how to get the metadata of experience cloud in vscode
Loss function and positive and negative sample allocation: Yolo series
使用 percona 工具给 MySQL 表加字段中断后该如何操作
Libcurl Lesson 13 static library introduces OpenSSL compilation dependency
MD5 encryption
Name of institution approved in advance
高考录取分数线爬虫
【Experience Cloud】如何在VsCode中取得Experience Cloud的MetaData
高考录取分数线爬取
02.面向容器化后,必须面对golang
二叉树前,中,后序遍历
6096. Success logarithm of spells and potions
5. Practice: jctree implements the annotation processor at compile time
/bin/ld: 找不到 -lxslt
【LeetCode】417-太平洋大西洋水流问题