Pyinstaller和Tesseract OCR

4
我正在使用Tesseract OCR编写程序,我将使用pyinstaller将其转换为单个.exe文件。问题在于,为了使Tesseract正常工作,我需要引用计算机上安装的程序路径,例如:pytesseract.pytesseract.tesseract_cmd = 'E:\\Tesseract-OCR\\tesseract' 由于这不仅是可以导入的独立库,而是一个独立的程序,因此我无法将其作为“--add_data”参数传递给pyinstaller。那么我该如何制作一个单文件可执行文件呢?

[python] [tesseract] path中选择一个。 - stovfl
1
不,我的问题还没有得到答案。Tesseract运行正常,路径也正确。问题在于将Tesseract与我的程序一起打包成一个可执行文件。Tesseract不是像jpg或文本文档那样可以附加到pyinstaller上的,我也不能附加包含另一个程序的整个文件夹。 - Mirrah
从你的问题中:“我需要引用路径”?这不是pyinstaller设置正确的环境路径到tesseract的部分。你必须在目标计算机上或在你的Python程序中进行设置。 - stovfl
我是想为pyinstaller引用它。所以使用我的程序时,用户需要单独安装tesseract,对吗? - Mirrah
“用户需要单独安装tesseract,对吗?”:这是一个可能的解决方案。据我所知,“pytesseract”是围绕“tesseract.exe/.dll”包装的,并期望在适当位置找到“.exe/*.dll”。我可以想象,“pyinstaller”可以捆绑所有二进制文件,但您必须设置环境变量,以便“pytesseract”能够找到并加载这些文件。 - stovfl
6个回答

7
假设你在使用Windows系统,我也遇到过这个问题,并且认为通过编译tesseract的静态版本(不需要安装)并将其路径作为二进制文件包含在pyinstaller规范文件中来解决了它。
官方编译说明在此处:

https://tesseract-ocr.github.io/tessdoc/Compiling.html#windows

安装 MS Visual Studio 15(带 c++) 和 vcpkg 并通过命令提示符执行以下操作之一:

64 位: vcpkg install tesseract:x64-windows-static

32 位: vcpkg install tesseract:x86-windows-static

tesseract 可执行文件将位于 PC 上的 vcpkg 文件夹中的几个子文件夹内。除此文件外,您还需要下载一个 .trainneddata 文件,并将其放置在名为“tessdata”的文件夹中,与 tesseract exe 在同一目录下。

创建 pyinstaller 规范文件并编辑 Analysis(binaries=[]) 部分以包括 tesseract 所在的文件夹路径(如果您不使用 tesseract 的子文件夹,则需要添加 tesseract.exe 和 tessdata 子文件夹)。我也更改了 inclide_binaries=True

运行 pyinstaller 并包括选项 --specpath 'yourspecfile.spec'

我尚未尝试在另一台电脑上运行它,因此还没有完全测试它是否按预期工作(我对编译 c++ 一无所知,可能还需要其他文件/链接以支持 tesseract,因为我只在构建 PC 上进行测试)


如果你有问题请告诉我。这个问题让我很头疼,所以我很乐意提供帮助! - Zstr33
我终于安装了vcpkg和tesseract-static,但现在无法弄清如何在代码中正确引用.exe和.traineddata。网站上的示例有点令人困惑。我的意思是,现在我们没有tesseract.exe和traineddata了,而是有一个单文件可执行脚本,所以我不能像pytesseract.pytesseract.tesseract_cmd ='E:\Tesseract-OCR\tesseract'那样做,对吗?那么我们如何才能正确地引用它呢?非常感谢! - Mirrah
1
你仍然有tesseract.exe和trainneddata文件。我将它们保存在我的Python代码的子文件夹中。对于pyinstaller onefile,您还需要使用解决文件路径的方法,请参见此处resource_path函数的答案:https://dev59.com/EGsz5IYBdhLWcg3wxax3 - Zstr33
1
补充上一条评论,当使用resource_path函数引用tesseract时,您需要这样做:pytesseract.pytesseract.tesseract_cmd = resource_path('\tess\tesseract.exe'),其中“tess”是我在主项目文件夹中保存tesseract的子文件夹。您必须这样做的原因是因为pyinstaller onefile选项在运行时会将所有内容解压缩到临时文件夹中。 - Zstr33

4

@Zstr33的回答是正确的,但缺少细节。下面的指导已在Windows 10 64位上进行了测试。官方编译指南链接:https://tesseract-ocr.github.io/tessdoc/Compiling.html#windows

步骤:

  1. 安装Visual Studio。确保安装以下内容:点击Desktop Development with C++和Universal Windows Platform Development

    然后,单击“个人组件”。

    单击标签页个人组件

    然后,选择以下内容。
    Nuget Package Manager、MSVC v142 - VS 2019 C++ x64/x86 build tools、C++ CMake Tools for Windows、MSVC v142 - VS 2019 C++ ARM64 Build Tools和NuGet targets and build tasks

    你可以添加其他组件,但这些组件是编译tesseract静态二进制文件所需的。此外,如果你不使用英语,请单击语言包选项卡并添加英语语言包,这对于vcpkg是必需的。

  2. 按照快速入门指南安装vcpkg,可以在这里找到:https://github.com/microsoft/vcpkg#getting-started

  3. 导航到复制vcpkg目录的位置,或将其添加到路径中。然后运行:vcpkg install tesseract:x64-windows-static(64位)或vcpkg install tesseract:x86-windows-static(32位)。

  4. 转到放置tesseract目录的位置\tesseract_x64-windows-static\tools\tesseract(64位),或者放置tesseract目录的位置\tesseract_x86-windows-static\tools\tesseract(32位)。

  1. 使用--onefile与pyinstaller一起使用。

3

我使用以下命令使用Tesseract和EasyOCR构建了我的应用程序exe,希望这可以帮到你。

python -m PyInstaller --paths "fullpath-to-custom-libraries" --add-data "C:\Program Files\Tesseract-OCR;Tesseract-OCR" --collect-all easyocr --onedir -w main.py

1
我最终成功了使用Pyinstaller运行它。
首先,我需要创建两个Hook文件,如此处所述:

https://github.com/jbarlow83/OCRmyPDF/issues/659#issuecomment-714479684

然后,在运行exe时,我仍然遇到了一个错误,缺少pikepdf._cpphelpers

要解决这个问题,只需要添加:

from pikepdf import _cpphelpers

按照这里描述的方式,在您的Python文件中:

如何在我的脚本导入模块pikepdf和pdfminer3时修复pyinstaller“没有模块命名……”错误?

我的Pyinstaller调用看起来像这样:

pyinstaller --onefile appname.py --paths="C:\python\anaconda3\envs\appname\Lib\site-packages" --additional-hooks-dir="C:\coding\appname\Hooks"

0

由于使用pyinstaller打包可能会非常麻烦,因此我采取了以下步骤:

  1. 在我的脚本中导入Pytesseract
  2. 使用pyinstaller创建Exe文件(在我的spec文件中没有定义任何内容)
  3. 使用外部安装程序创建Tesseract-Ocr安装程序和我的script.exe。

因此,最终用户将同时拥有tesseract安装程序和tesseract。 使用外部安装程序,您可以拥有很多自由度,并且还可以玩弄路径变量。


这是一个不错的解决方案,谢谢!不过我无法生成单个可执行文件,是吗?因为这意味着我将无法引用其他可执行文件。但我想这可能是最简单的方法,感谢。 - Mirrah
你能详细解释一下吗? - Talha Anwar

0

我尝试了使用pyinstaller和ocrmypdf,但始终无法使其正常工作。最终我使用了Nuitka,从一开始就可以正常工作 :-)

可以使用类似以下的方式:

python -m nuitka --mingw64 --standalone --follow-imports  yourapp.py

http://nuitka.net/doc/user-manual.html

这里已经有一个类似的答案了,只是找不到链接了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接