python代码带文件夹打包成exe

问题遇到的现象和发生背景

我需要将自己写的代码打包成exe文件,方便分享给别人使用,代码执行时需要读取fapiao1文件夹下的发票照片和txt文件夹下的数据,他们之间的层级关系是同一层级,我在写代码时写的是相对路径,没有将路径写死,所以打包之后也要有fapiao1文件夹和txt文件夹,bar文件夹是代码运行依赖的第三方库,应该也是需要打包进去的,我需要打包后的exe文件和打包教程供学习

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法

我用的是pyinstaller进行打包,打包过程是没有报错,但是打包之后的文件无法运行,问题出现在网络请求上,也不知道缺乏依赖库还是其他的原因

我想要达到的结果

我需要打包后的exe文件和打包教程供学习

文件我已经打包发到蓝奏云上去了:https://wwz.lanzoum.com/i8i5p03pe4he

img

img

img

如果你给别人使用,fapiao1文件夹和txt文件夹 这两个文件夹里的内容应该是别人提供啊,只要在exe 文件同目录下有这两个文件夹就可以了,打包并不需要依赖这两个文件把

尝试了30分钟左右,看了几篇教程,差不多弄懂了。

两种方式:

  1. 喜欢命令行,可以使用命令行编译。
  2. 不喜欢命令行,使用pycharm非常方便,看你的截图,你也是在用这个软件。

首先,跟着下面这个教程,配置两个外部工具:
https://blog.csdn.net/vertor11/article/details/103741820

img

配置完成后,运行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文件夹,复制到其他地方,发现也可以成功运行!完成!

img

img

另外,建议学习下官网教程,很有意思,配有实例。主要看下面两个部分:

img

建议参考学习的教程:
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文件夹内

img

img


这个流程我是跑通了,你可以按这个改一下试试

看朋友你的意思,好像是现在网上的方法都解决不了?打包生成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