我需要将自己写的代码打包成exe文件,方便分享给别人使用,代码执行时需要读取fapiao1文件夹下的发票照片和txt文件夹下的数据,他们之间的层级关系是同一层级,我在写代码时写的是相对路径,没有将路径写死,所以打包之后也要有fapiao1文件夹和txt文件夹,bar文件夹是代码运行依赖的第三方库,应该也是需要打包进去的,我需要打包后的exe文件和打包教程供学习
我用的是pyinstaller进行打包,打包过程是没有报错,但是打包之后的文件无法运行,问题出现在网络请求上,也不知道缺乏依赖库还是其他的原因
我需要打包后的exe文件和打包教程供学习
文件我已经打包发到蓝奏云上去了:https://wwz.lanzoum.com/i8i5p03pe4he
如果你给别人使用,fapiao1文件夹和txt文件夹 这两个文件夹里的内容应该是别人提供啊,只要在exe 文件同目录下有这两个文件夹就可以了,打包并不需要依赖这两个文件把
尝试了30分钟左右,看了几篇教程,差不多弄懂了。
两种方式:
首先,跟着下面这个教程,配置两个外部工具:
https://blog.csdn.net/vertor11/article/details/103741820
配置完成后,运行py_sepc_gen
生成fapiao.spec
文件。然后修改(修改我注释的部分):
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
resources=[('5.ico','5.ico'), ('txt','txt'), ('fapiao1', 'fapiao1')] # 添加resource
a = Analysis(
['fapiao.py'], # 项目入口py文件
pathex=['D:\\kangbb\\python\\bag'], # 项目的绝对路径,换成你自己的
binaries=[],
datas=resources, # 添加resource
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='fapiao',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
接下来,修改源文件。由于打包了资源文件,所以需要获取打包后的资源文件。添加以下函数,且修改部分源码:
# 获取打包资源的路径基地址
def get_resource_path():
if hasattr(sys, "_MEIPASS"):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath('.')
return base_path
# fapiao.py 204行
path = get_resource_path()+'/fapiao1'
# fapiao.py 227行
file = open(get_resource_path()+'/txt/AK.txt', 'r', encoding='utf-8').read()
运行pyinstaller_by_spec
,生成.exe文件。在dist文件夹,复制到其他地方,发现也可以成功运行!完成!
另外,建议学习下官网教程,很有意思,配有实例。主要看下面两个部分:
建议参考学习的教程:
https://blog.csdn.net/vertor11/article/details/103741820
http://c.biancheng.net/view/2690.html
https://pyinstaller.org/en/stable/spec-files.html
print(sys.argv[0]) -- 获取当前执行exe文件
print(os.path.dirname(os.path.realpath(sys.executable))) --获取当前执行目录
检查你的main.spec文件
在代码里添加以下代码:
import sys
#定义一个函数
def get_resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
在读取文件的时候这样读:
file = open(get_resource_path('./txt/AK.txt'), 'r', encoding='utf-8').read()
打包exe命令:
pyinstaller -F -w -i 5.ico --add-data "txt;txt" fapiao.py
生成exe以后把要识别的图片放到exe同级目录的fapiao1文件夹内
看朋友你的意思,好像是现在网上的方法都解决不了?打包生成exe这个很常见的,如果还不行的建议你换一下python的版本,高版本的限制会少很多
PS:自带的杀毒软件等等在打包时务必关闭哦
别再问我怎么Python打包成exe了!
以下内容转载自我的原创文章
:
提前准备好CMD(这都不知道?!如果这都不知道就不用再学编程了)
1安装pyinstaller库:没啥好说的,长按复制粘贴:pip install pyinstaller
2在C盘里新建一个文件夹📁,把你的文件移到这个文件夹里(不用重命名,新建文件夹就行),cmd里输入以下代码:cd:C/新建文件夹(注:我写新建文件夹的原因是因为我没有重新命名,如果你们重新命名过,请把/后面的“新建文件夹”改为你们重新命名的名字)
3开始干正事儿!打包!:pyinstaller -F xxxx.py(要打包的py文件)
代码不想看,但是你说的问题,我经常做,我能只提供思路吗?
既然你要读取这个文件夹下的内容,你就让用os自己创建呗,如果已有你就try pass掉。
#创建文件夹
try:
os.makedirs('./out')
except:
pass
打包exe用我这个,在cmd里执行,路径自己修改,对应的py需要放进包含所调用库的site-packages里:
D:\python\Python39\Scripts\pyinstaller -F -w D:/python/project/venv/Lib/site-packages/CL_tool.py