毕设写的工具最近才想起来应该做成个exe造福大众,奈何路途曲折
先是vs直接装的pyinstaller不管用;后是不知如何打多个文件的项目(最后写在一个.py里了……还有import的包尽量减少了);最后是图片文件不会打包在一起,让我有种擦屎擦不干净的不爽的感觉——一个小exe还必须和几个固定命名的图片在一个文件夹内不然打不开!!
今天看了看了不少帖子,方法有的简单但是不成功;有的麻烦,要改的东西有点多就不想尝试;最后看着错误提示加思考终于成功的打了个exe!
pyinstaller的安装:
参照https://blog.csdn.net/lqzdreamer/article/details/77917493
单个exe啥也不用的话,下面的命令就够了。
pyinstaller -F test.py
接下来介绍打包图片的方法。
开始是参考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,觉得麻烦,没用它)