当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法

我写了一段py程序,里面开头引用到import pytesseract,然后写好后我用pyinstaller -F  XXX.py对主程序进行封装,封装成exe后,在我自己的电脑上可以运行。

但是我发给其他人使用时,在别人的电脑上运行了一半就没法运行。

提示下面的错误:

D:\dist\pt_guodu.png

Traceback (most recent call last):

  File "pytesseract\pytesseract.py", line 256, in run_tesseract

  File "subprocess.py", line 854, in __init__

  File "subprocess.py", line 1307, in _execute_child

FileNotFoundError: [WinError 2] 系统找不到指定的文件。

图片如下:

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第1张图片

意思是说找不到pyteseeeract这个程序,说我要不没安装,要不就没有设置好环境变量。

一开始我就觉得可能是,pytesseract安装时的安装方式与通过pip安装的其他模块方式不一样有关,因为pytesseract是一个独立程序,不是经过pip安装的模块,所以在打包时没有连同pytesseract一起打包起来封装在exe里。

我做了第一次尝试:

我试着重新pip 安装了tesseract。

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第2张图片

也pip了pytesseract,结果还是不行。

接着我做了第二次尝试:

后来突然想起之前在写py文件时,出现错误如下:

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in your path

图如下:

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第3张图片

我当时解决方法时:复制上面图片中选中的那个地址(记住,这个地址不是固定的,有的按你的设置,这个py文件可能会在你的虚拟环境里,所以要点上图最后那个蓝色的字体的地址,而不能把它认定为固定位置),去那个地址下,找到pytesseract.py文件并打开,按照下面图这样修改:

# tesseract_cmd = 'tesseract'        # 这段改成下面这一段

tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

我觉得可能是这个这里涉及到绝对路径,打包后去到别人的电脑没有这个路径,才会报错。

于是我决定把它改了回来。让上面的第一行运行,下一行关闭。然后通过设置环境变量的方式解决好这个问题。

设置方法如下:

  • 先去看你的tesseract的安装地址是哪里,我的是C:\Program Files\Tesseract-OCR

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第4张图片

二、然后去到你的系统属性界面。

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第5张图片

点击上图的环境变量。

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第6张图片

这里,只改系统变量就行,不用管用户变量。

选择变量名为Path,然后把上面第一点的地址,添加进去。

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第7张图片

接着,点击新建按钮,变量名和我写一样,变量值则是你第一步的那个安装地址,加上“\tessdata”,如下图,这里添加的这个变量,是加上各种文字库。

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第8张图片

然后就一步步点确定返回来。

这里要注意:为了使刚刚设置好的环境变量生效,必须关闭cmd窗口和pycharm文件等,再重新启动时才能有效。

经过这样设置,再通过下面的操作对文件进行封装。

(在后面,输入输入 “cd/d ”+你的py文件放置的那个路径,按回车。然后就可以输入pyinstaller -F  XXX.py了。)

改了环境变量,可以运行,以为这次该成功了吧,打包出来拿到其他电脑上,还是不行。

经过这么多次测试,我明白应该是tesseract根本就没有打包进exe

凡是跟我一样,主程序用到tesseract封装去到别人的电脑上运行提示没有安装tesseract或者没有设置好环境变量的。原因就是因为tesseract压根就没有一起封装进exe里!

接着我做第三次尝试:

我从这个路径里(你在pycharm开发环境设置里选择的那个路径的site-packages)

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第9张图片

打开你所选的那个开发环境下的pytesseract.py(后来我发现,这个地址不是固定的,有的电脑是引导到了你设置的虚拟环境,所以要选择报错内容里的最后那一行蓝色地址里的py文件) 后,对tesseract_cmd=’tesseract’语句做出以下修改:

1、增加import os    # os库是跟随python一起安装的库,不需要单独安装,但是使用前要improt os

2、把tesseract_cmd=”tesseract”改成tesseract_cmd = os.getcwd() + '\\OCR\\tesseract.exe'

如下图:

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第10张图片

注意:这里如果没有加import os 的话,系统会报错说

这样改了之后,程序运行时,就通过主程序的根目录下,先找OCR文件夹,再找到tesseract.exe。这里设置好了之后,接着去你当时安装Tesseract-OCR时的位置,如果你没有自选路径的话,就会跟我一样安装在C盘,找这个路径(如果你安装时有更改了目录,就去你更改的那个目录里找)

当主程序引用了tesseract程序,python打包出来的exe无法在其他电脑上运行的问题的解决方法_第11张图片

然后复制Tesseract-OCR,然后粘贴到了你的.py主程序的同一个根目录里,并且改名为OCR(这样才会跟上面os.getcwd() + '\\OCR\\tesseract.exe'指定的路径一样,你也可以不改名,我改名字是为了免得文件名太长)

然后到时打包好的exe,会生成在dist里,再把OCR复制进去exe里,就又是跟exe同一个目录了,这样就可以把dist文件夹压缩后发给其他电脑使用了。

由于Tesseract是单独安装的程序,所以我相信其他类似Tesseract单独安装的程序,也很可能会出现同样的问题,并且也很可能可以通过我说的这种方法加以解决。琢磨了挺久,弄好后我想记录下来使得有更深的理解,同时也希望能为遇到同类问题的朋友们提供一点帮助。

你可能感兴趣的:(pycharm,python,ide)