Python之pyinstaller打包exe填坑总结

news2024/11/23 4:22:42

一、起因

编写了一个提取图片中文字的python脚本,想传给同事使用,但是同事电脑上没有任何python环境,更没有安装python库,因此想到通过pyinstaller打包成exe程序传给同事使用,于是开始了不断地挖坑填坑之旅

import pytesseract
from PIL import Image
import tkinter
import tkinter.messagebox
from tkinter import filedialog

def select_file():
    file_path = filedialog.askopenfilename()
    if file_path:
        var_imagepath.set(file_path)  # Update the entry widget with the selected file path
        but_tiqu.config(state=tkinter.NORMAL)  # Enable the "提取文字" button

def extract_ocr_text(image_path):
    try:
        image = Image.open(image_path)
        text = pytesseract.image_to_string(image)
        return text
    except Exception as e:
        return f"Error: {str(e)}"
    
def cancel():
    var_imagepath.set('') 
    winoutput.delete("1.0","end")

win = tkinter.Tk()
win.geometry("1100x550")
win.title("图片文字提取工具")

var_imagepath = tkinter.StringVar()


# 展示数据
labimage = tkinter.Label(win, text='图片路径', width=80)
laboutput = tkinter.Label(win, text='提取结果', width=80)
entimagepath = tkinter.Entry(win, width=200, textvariable=var_imagepath)
winoutput = tkinter.Text(win, width=200, height=300)
scrollbar = tkinter.Scrollbar(win, command=winoutput.yview)
winoutput.config(yscrollcommand=scrollbar.set)

but_image = tkinter.Button(win, text='选择图片', command=select_file)
but_tiqu = tkinter.Button(win, text='提取文字', command=lambda: show_extracted_text(var_imagepath.get()), state=tkinter.DISABLED)  # Disable the button initially
but_cancel=tkinter.Button(win,text='清空',command=cancel)

# ----设计组件布局----
labimage.place(x=20, y=20, width=80, height=30)
laboutput.place(x=20, y=180, width=80, height=30)
entimagepath.place(x=120, y=20, width=280, height=25)
winoutput.place(x=120, y=55, width=900, height=400)
but_image.place(x=410, y=20, width=99, height=25)
but_tiqu.place(x=540, y=20, width=99, height=25)
scrollbar.place(x=1020, y=55, height=400)
but_cancel.place(x=670,y=20,width=50,height=25)

def show_extracted_text(image_path):
    if image_path:
        extracted_text = extract_ocr_text(image_path)
        winoutput.delete(1.0, tkinter.END)  # Clear the existing text in the output Text widget
        winoutput.insert(tkinter.END, extracted_text)

win.mainloop()    # 进入消息循环

二、挖坑与填坑

1、第一坑

代码中import pytesseract导入了pytesseract库,pytesseract库依赖程序tesseract.exe,但是打包后exe缺少了对tesseract.exe的依赖导致无法运行。

1、填坑

a、找到pytesseract库的pytesseract.py文件

 b、修改为下图。这样程序运行时,就通过主程序的根目录下,先找OCR文件夹,再找到tesseract.exe。

 c、打包程序的时候将Tesseract-OCR放在.py同目录下

 d、打包成功后,将Tesseract-OCR放在dist目录下

这样就解决了脚本对程序的依赖问题。

2、第二坑 

出现报错:no module named ‘pkg_resources.py2_warn

2、填坑

先用pyinstaller -D(F) xxx.py生成一下(不一定能正常运行)

经过第一步之后,目录下有个.spec文件,用记事本打开,里面有个hiddenimports,在这条里面加上pkg_resources.py2_warn

 再次用pyinstaller,注意这时候输入的命令是pyinstaller -D(F) xxx.spec

即可解决问题(已测试)

填坑方法2:(未亲自测试)

1.pip uninstaller setuptools
2.pip installer setuptools==44.0.0
(不过这种方法对setuptools进行降级处理,可能有些功能不能使用)

3、第三坑

出现报错:‘ModuleNotFoundError: No module named 'pytesseract' 

3、填坑

在该目录下找到pytesseract文件夹

 将该文件夹复制到.py主程序同目录下

然后打包即可解决该问题。

 4、第四坑

出现报错:struct.error: unpack requires a buffer of 16 bytes

填坑

我不知道怎么解决的,好像换了个目录打包就解决了,还是换了个打包命令就解决了,我也忘记是如何解决的了,

这就是遇到的所有坑,最近没休息好,没有动脑子思考这些坑产生的原因是什么,解决的原理是什么,先暂时记录下来,后期再思考补充。

三、参考文章

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_python打包不能在其他电脑打开_py617的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/828672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka-消费者组消费流程

消费者向kafka集群发送消费请求,消费者客户端默认每次从kafka集群拉取50M数据,放到缓冲队列中,消费者从缓冲队列中每次拉取500条数据进行消费。

Dockerfile构建SSHD镜像

Dockerfile构建SSHD镜像 基于Dockerfile制作镜像时首先需要建立工作目录,作为生成镜像的工作目录,然后分别创建并编写 Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件。 1、环境配置: [rootdocker ~]# iptables -F [rootdoc…

用python+PyQt5来编写一个定时关机窗口

一、界面展示 二、源码 import sys from PyQt5.QtWidgets import QDesktopWidget,QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QSpinBox import osclass AutoShutdownApp(QWidget):def __init__(self):super().__init__()self.setWindowTitle("自动关机应…

Aop监控所有Controller,包括void类型的response中的出参(工具类)

一、主要坐标 <!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifa…

saas堡垒机定义以及优势简单说明

工作中我们经常可以听到saas这个词语&#xff0c;但对于saas堡垒机相信还有很多人不了解。今天我们就来一起简单聊聊什么是saas堡垒机&#xff0c;saas堡垒机有哪些优势。 saas堡垒机定义 saas堡垒机顾名思义为一款SaaS化堡垒机产品&#xff0c;即一款SaaS运维审计安全系统。…

学习记录——EGE-UNet、R2AU-Net、PHNet、CFNet

EGE-UNet: an Efficient Group Enhanced UNet for skin lesion segmentation 上海交大 2023 MICCAI 基于 U-Net 进行魔改&#xff0c;用于解决医学图像&#xff08;尤其是皮肤病变&#xff09;分割中面临的问题。由于它是针对移动健康应用开发的&#xff0c;解决了当前许多模型…

硬件系统工程师宝典(35)-----SDRAM是如何“提速”的?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们了解了FLASH可分为NOR FLASH和NAND FLASH&#xff0c;NOR FLASH一般用于代码运行及擦除或编程较少的场合&#xff0c;NAND FLASH用于擦除、…

【CSS】3D卡片效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"card"><img…

C# XML文档相关操作

C# 创建XML文档 XML文档知识点创建XML文档向XML中追加读取XML文档读取带属性的XML文档删除节点 XML文档知识点 XML 是可扩展的标记语言 XML:用来存储数据 注意点&#xff1a;XML是严格区分大小写的&#xff0c;XML标签也是成对出现的 XML文档有且只能有一个根节点&#xff1b;…

【浪费了我两个小时时间】Microsoft store无法加载页面0x80131500

绕的圈&#xff0c;踩的坑 谷歌搜索&#xff0c; newbing搜索都叫我清理缓存&#xff0c;重新安装等方法。 还被这篇文章误导了一下&#xff1a;微软应用商店错误代码0x80072EFD怎么办&#xff1f;&#xff08;已解决&#xff09; 加上重启电脑各种试不行。 最后想到要去改代…

Maven发布项目到Nexus私服

项目pom配置 在项目pom.xml中文件中的仓库配置&#xff0c;Nexus私服如何搭建在这里不介绍了可自行百度。 <distributionManagement><repository><id>releases</id><name>Nexus Release Repository</name><url>http://私服地址:34…

C++设计模式之桥接设计模式

文章目录 C桥接设计模式什么是桥接设计模式该模式有什么优缺点优点缺点 如何使用 C桥接设计模式 什么是桥接设计模式 桥接设计模式是一种结构型设计模式&#xff0c;它可以将抽象接口和实现分离开来&#xff0c;以便它们可以独立地变化和扩展。 该模式有什么优缺点 优点 灵…

定时任务之Springboot整合Quartz详解

文章目录 一、什么是Quartz二、为什么使用Quartz1、为什么要用定时任务2、为什么使用Quartz 三、常见开源定时任务的框架的异同四、Quartz的相关概念五、Quartz的使用&#xff08;此处讲解使用主要流程&#xff09;六、开源引擎框架与业务如何结合使用 一、什么是Quartz quartz…

springboot通过springdata整合es7.x

首先要明确通过springdata操作es必须要将版本号和es的版本号对应上&#xff0c;否则会报错&#xff08;倒不用完全一一对应&#xff0c;但版本号最好不要相差太多&#xff09;。springdata引入的版本号由springboot的版本号决定&#xff0c;对应关系如下&#xff1a; 这里我用…

一起来学习怎样将文档翻译成中文的同时维持原有格式

在快节奏的现代生活中&#xff0c;文档翻译软件成为我们处理多语言文本的得力工具。然而&#xff0c;当我们使用文档翻译软件时&#xff0c;有时会面临一个头疼的问题&#xff1a;即使翻译出了准确的词句&#xff0c;但格式却完全没有保留下来。这时候&#xff0c;我们怎么办呢…

常见OOM异常分析排查

常见OOM异常分析排查 Java内存溢出Java堆溢出原因解决思路总结 Java内存溢出 java堆用于存储对象实例,如果不断地创建对象,并且保证GC Root到对象之间有可达路径,垃圾回收机制就不会清理这些对象,对象数量达到最大堆的容量限制后就会产生内存溢出异常. Java堆溢出原因 无法在…

mysql月统计数据,没有的填充为0

要按时间戳字段按月份分组查询记录表&#xff0c;可以使用DATE_FORMAT函数将时间戳字段格式化为年月格式&#xff0c;然后将结果按照该字段进行分组。 SELECT a.month month,ifnull(b.count, 0) count FROM (SELECT 1 month UNION ALL SELECT 2 month UNION ALL SELECT 3 mont…

为何企业和开发团队应该重视进行兼容性测试

随着科技的不断进步和软件的广泛应用&#xff0c;保证软件在不同平台和环境下正常运行变得至关重要。本文将探讨软件兼容性测试的重要性和好处&#xff0c;并介绍为何企业和开发团队应该重视进行兼容性测试&#xff0c;以确保软件的稳定性和用户体验。 提供用户友好的体验 软件…

xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。

先阐述一下我的业务场景&#xff0c;我有一个iOS的app sdk项目&#xff0c;下面简称 A &#xff0c;以及运行 A 的 app 项目&#xff0c;简称 A demo 。 引用关系为 A demo 引用了 A &#xff0c;而 A 引用了 ffmpeg 的静态库&#xff08;.a文件&#xff09;。此时业务出现了 b…

线程、进程和管程

一、线程 1.1 定义 线程&#xff1a;线程是进程中的实体&#xff0c;一个进程可以拥有多个线程&#xff0c;一个线程必须有一个父进程。线程有时被称为轻量级进程&#xff0c;是程序执行流的最小单元。 线程的组成部分&#xff1a; 1. 线程ID&#xff1a;线程标识符 2. 当前…