我写了一段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] 系统找不到指定的文件。
图片如下:
意思是说找不到pyteseeeract这个程序,说我要不没安装,要不就没有设置好环境变量。
一开始我就觉得可能是,pytesseract安装时的安装方式与通过pip安装的其他模块方式不一样有关,因为pytesseract是一个独立程序,不是经过pip安装的模块,所以在打包时没有连同pytesseract一起打包起来封装在exe里。
我做了第一次尝试:
我试着重新pip 安装了tesseract。
也pip了pytesseract,结果还是不行。
接着我做了第二次尝试:
后来突然想起之前在写py文件时,出现错误如下:
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in your path
图如下:
我当时解决方法时:复制上面图片中选中的那个地址(记住,这个地址不是固定的,有的按你的设置,这个py文件可能会在你的虚拟环境里,所以要点上图最后那个蓝色的字体的地址,而不能把它认定为固定位置),去那个地址下,找到pytesseract.py文件并打开,按照下面图这样修改:
# tesseract_cmd = 'tesseract' # 这段改成下面这一段
tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
我觉得可能是这个这里涉及到绝对路径,打包后去到别人的电脑没有这个路径,才会报错。
于是我决定把它改了回来。让上面的第一行运行,下一行关闭。然后通过设置环境变量的方式解决好这个问题。
设置方法如下:
二、然后去到你的系统属性界面。
点击上图的环境变量。
这里,只改系统变量就行,不用管用户变量。
选择变量名为Path,然后把上面第一点的地址,添加进去。
接着,点击新建按钮,变量名和我写一样,变量值则是你第一步的那个安装地址,加上“\tessdata”,如下图,这里添加的这个变量,是加上各种文字库。
然后就一步步点确定返回来。
这里要注意:为了使刚刚设置好的环境变量生效,必须关闭cmd窗口和pycharm文件等,再重新启动时才能有效。
经过这样设置,再通过下面的操作对文件进行封装。
(在后面,输入输入 “cd/d ”+你的py文件放置的那个路径,按回车。然后就可以输入pyinstaller -F XXX.py了。)
改了环境变量,可以运行,以为这次该成功了吧,打包出来拿到其他电脑上,还是不行。
经过这么多次测试,我明白应该是tesseract根本就没有打包进exe。
凡是跟我一样,主程序用到tesseract,封装去到别人的电脑上运行提示没有安装tesseract或者没有设置好环境变量的。原因就是因为tesseract压根就没有一起封装进exe里!
接着我做第三次尝试:
我从这个路径里(你在pycharm开发环境设置里选择的那个路径的site-packages)
打开你所选的那个开发环境下的pytesseract.py(后来我发现,这个地址不是固定的,有的电脑是引导到了你设置的虚拟环境,所以要选择报错内容里的最后那一行蓝色地址里的py文件) 后,对tesseract_cmd=’tesseract’语句做出以下修改:
1、增加import os # os库是跟随python一起安装的库,不需要单独安装,但是使用前要improt os
2、把tesseract_cmd=”tesseract”改成tesseract_cmd = os.getcwd() + '\\OCR\\tesseract.exe'
如下图:
注意:这里如果没有加import os 的话,系统会报错说
这样改了之后,程序运行时,就通过主程序的根目录下,先找OCR文件夹,再找到tesseract.exe。这里设置好了之后,接着去你当时安装Tesseract-OCR时的位置,如果你没有自选路径的话,就会跟我一样安装在C盘,找这个路径(如果你安装时有更改了目录,就去你更改的那个目录里找)
然后复制Tesseract-OCR,然后粘贴到了你的.py主程序的同一个根目录里,并且改名为OCR(这样才会跟上面os.getcwd() + '\\OCR\\tesseract.exe'指定的路径一样,你也可以不改名,我改名字是为了免得文件名太长)
然后到时打包好的exe,会生成在dist里,再把OCR复制进去exe里,就又是跟exe同一个目录了,这样就可以把dist文件夹压缩后发给其他电脑使用了。
由于Tesseract是单独安装的程序,所以我相信其他类似Tesseract单独安装的程序,也很可能会出现同样的问题,并且也很可能可以通过我说的这种方法加以解决。琢磨了挺久,弄好后我想记录下来使得有更深的理解,同时也希望能为遇到同类问题的朋友们提供一点帮助。