Umi-OCR icon indicating copy to clipboard operation
Umi-OCR copied to clipboard

在 Windows 11 運行問題

Open peter8777555 opened this issue 6 months ago • 12 comments

OS: Windows 11 23H2 22631.2715 繁體中文

Umi-OCR_Rapid_v2.0.1

Umi-OCR.exe 無任何反應 RUN_CLI.bat 一切正常 RUN_GUI.bat 無任何反應

Umi-OCR_Paddle_v2.0.1

Umi-OCR.exe 無任何反應 RUN_CLI.bat 一切正常 RUN_GUI.bat 無任何反應

RUN_CLI.bat 當 第 1 次 截圖 並 OCR 後 正常識別, 第 2 次 重新截圖 都是 第 1 次 的狀態,無法開始 新的 截圖識別.

peter8777555 avatar Dec 18 '23 23:12 peter8777555

1. 请尝试一下:在命令行里运行 Umi-OCR.exe ,会打印什么信息?

在 Umi-OCR 目录下,右键→在终端中打开,输入./Umi-OCR.exe


2. 你的症状看起来跟这个旧issue比较相像: https://github.com/hiroi-sora/Umi-OCR_v2/issues/21 。

请检查一下,在命令行中运行exe,或者通过RUN_CLI.bat启动时:控制台打印的信息,跟上述issue中的记录是否有相似之处?是否都有类似 WinError 31 的报错?


3. 一个小实验

Umi-OCR/main.py 备份一下,然后用记事本打开它,删除全部代码,替换为下述文本:

import ctypes
msg = "Hello Umi!"
ctypes.windll.user32.MessageBoxW(None, str(msg), str(msg), 0)

保存,尝试运行 Umi-OCR.exe 。正常情况下应该显示一个系统弹窗。

hiroi-sora avatar Dec 19 '23 11:12 hiroi-sora

  1. 请尝试一下:在命令行里运行 Umi-OCR.exe ,会打印什么信息?

在 命令行 運行 都正常, 但在 Explorer.exe 中 雙擊 運行, 則 TaskMgr.exe 會看到運行 1 秒 就不見了.

但奇怪的是

  1. 一个小实验 将 Umi-OCR/main.py 备份一下,然后用记事本打开它,删除全部代码,替换为下述文本:

import ctypes msg = "Hello Umi!" ctypes.windll.user32.MessageBoxW(None, str(msg), str(msg), 0)

在 Explorer.exe 中 雙擊 運行正常,會顯示一個系統彈窗.

我猜會不會是 main.py 有某處程序碼不兼容 Windows 11.

另外: 測試 Paddle 及 Rapid 版, Paddle 版 最沒有問題, 本來是使用 Rapid 版, 改用 Paddle 版.

Rapid 有以下問題: 1. 當 第 1 次 截圖 並 OCR 後 正常識別, 但原 CMD Console 窗口, 會莫明的 變賊小, 文字 小到 螞蟻 看不清.

第 2 次 截圖 並 OCR 會 死循環 一直無法識別,只能點擊 停止任務

peter8777555 avatar Dec 19 '23 23:12 peter8777555

感谢测试,信息很有帮助。我推测有可能是您的 繁中Windows系统 对管道编码存在一定影响。

请将 main.py 的内容替换为下列代码。执行 Umi-OCR.exe 时,如果出现错误,应该会出现一个 Error XXXXX 的系统弹窗,并生成一个日志文件 log.txt 在同级目录下。请将 log.txt 的内容放上来我看看。

点击展开
import os
import sys
import site


def MessageBox(msg, type="error"):
    import ctypes

    info = "Umi-OCR Message"
    if type == "error":
        info = " Umi-OCR Error"
    elif type == "warning":
        info = " Umi-OCR Warning"
    ctypes.windll.user32.MessageBoxW(None, str(msg), str(info), 0)
    return 0


def initRuntimeEnvironment(startup_script):
    """初始化运行环境"""

    # 尝试获取控制台的输出对象
    try:
        fd = os.open("CONOUT$", os.O_RDWR | os.O_BINARY)
        fp = os.fdopen(fd, "w")
    except Exception as e:
        fp = open(os.devnull, "w")
    # 输出流不存在时,重定向到控制台
    if not sys.stdout:
        sys.stdout = fp
    if not sys.stderr:
        sys.stderr = fp
    # def except_hook(cls, exception, traceback):
    #     sys.__excepthook__(cls, exception, traceback)
    # sys.excepthook = except_hook

    os.MessageBox = MessageBox

    # 初始化工作目录和Python搜索路径
    script = os.path.abspath(startup_script)  # 启动脚本.py的路径
    working = os.path.dirname(script)  # 工作目录
    os.environ["APP_WORKING"] = working
    os.chdir(working)  # 重新设定工作目录(不在最顶层,而在UmiOCR-data文件夹下)
    for n in [".", "site-packages"]:  # 将模块目录添加到 Python 搜索路径中
        path = os.path.abspath(os.path.join(working, n))
        if os.path.exists(path):
            site.addsitedir(path)


def runScript():
    # 默认启动脚本
    from py_src.run import main

    main()


if __name__ == "__main__":
    log = os.path.abspath("log.txt")
    try:
        initRuntimeEnvironment(__file__)  # 初始化运行环境
    except Exception as e:
        MessageBox("Error initRuntimeEnvironment !\n\n" + log)
        with open(log, "a") as f:
            err = "\nError initRuntimeEnvironment !\n" + str(e)
            f.write(err)
    try:
        runScript()  # 启动脚本
    except Exception as e:
        MessageBox("Error runScript !\n\n" + log)
        with open(log, "a") as f:
            err = "\nError runScript !\n" + str(e)
            f.write(err)

hiroi-sora avatar Dec 20 '23 04:12 hiroi-sora

z1

peter8777555 avatar Dec 20 '23 04:12 peter8777555

啊,非常抱歉有行语句忘了删。请将上述代码中的

raise Exception("12543124524")

这一行删掉,再测试。

hiroi-sora avatar Dec 20 '23 04:12 hiroi-sora

z2

peter8777555 avatar Dec 20 '23 04:12 peter8777555

OK,这样就确认了,确实是繁中系统的编码问题。

我后续会搭一个繁中系统环境来测试修改。请你先用着命令行启动方式或者1.3.7的旧版。

hiroi-sora avatar Dec 20 '23 09:12 hiroi-sora

我有個疑問:

同樣的 EXE, 為啥在 命令行 能運行, 在 Explorer.exe 中 雙擊 不能運行, 這不符合邏輯 ?

PS 1: 試了 V1.3.7 果然 命令行 及 在 Explorer.exe 中 雙擊 都能運行.

PS 2: 建議 將 README_CLI.md README_HTTP.md 放在 Umi-OCR.exe 同目錄 方便查看

另外, 我測試 命列行 參數 報錯

z3

peter8777555 avatar Dec 20 '23 10:12 peter8777555

在 命令行 能運行, 在 Explorer.exe 中 雙擊 不能運行

代码中有一些 print 语句用于打印信息。在命令行中运行时,输出到 "CONOUT$" 。双击运行时,由于不存在命令行窗口,所以输出到 os.devnull 。我估计是这里存在区别,导致了问题。

我大概已经查明,问题出在这行代码:

        print(f"翻译加载完毕。{self.langCode} - {text}")

简体的跟繁体的不同。繁中系统的某个系统组件可能无法解码,导致运行到这行代码时报错。

当然,”这行代码报错“只是表面现象,光是删掉它并不能解决问题。治本的方法是搞定文本编码兼容性。还在研究。


命令行 參數 報錯

在命令行中传入参数时,程序会在后台拉起一个新的进程,等价于在 Explorer 中双击启动软件。所以无法运行。

hiroi-sora avatar Dec 21 '23 03:12 hiroi-sora

感謝說明.

你慢慢研究, 先用 命令行 能用就好.

另外, Umi-OCR.exe --path "D:\xxx.png"`

建議 加個 Umi-OCR.exe --FileList "D:\FileList.txt"`

D:\FileList.txt 內容 D:\Test\Test1.jpg D:\Test\Test2.jpg D:\Test\Test3.jpg D:\Test\Test4.jpg D:\Test\Test5.jpg

這樣能 1 次轉 N 個

peter8777555 avatar Dec 21 '23 03:12 peter8777555

我找到了解决方法,在虚拟机繁体系统上验证通过。请你测试一下。

在 main.py 的中间有一段这样的代码:

    # 尝试获取控制台的输出对象
    try:
        fd = os.open("CONOUT$", os.O_RDWR | os.O_BINARY)
        fp = os.fdopen(fd, "w")
    except Exception as e:
        fp = open(os.devnull, "w")

在两个 "w" 的后面加上【 , encoding="utf-8" 】,也就是改成这样:

    # 尝试获取控制台的输出对象
    try:
        fd = os.open("CONOUT$", os.O_RDWR | os.O_BINARY)
        fp = os.fdopen(fd, "w", encoding="utf-8")
    except Exception as e:
        fp = open(os.devnull, "w", encoding="utf-8")

完成这个改动后,可在 Explorer 中正常双击运行。

hiroi-sora avatar Dec 22 '23 03:12 hiroi-sora

試了 encoding="utf-8" 果然問題都解決.

  1. 在 Explorer.exe 中 雙擊 運行 沒問題.
  2. 命令行 下參數 運行 沒問題.

PS: 建議: 命令行 是否不要顯示 UI 窗口, 看起來有點怪.

PS: Umi-OCR.exe --path "F:\Test\2\a4\z1.png" 是否能直接建立 F:\Test\2\a4\z1.txt 這樣比較直覺.

PS: 建議 加個 Umi-OCR.exe --FileList "D:\FileList.txt"`

D:\FileList.txt 內容 D:\Test\Test1.jpg D:\Test\Test2.jpg D:\Test\Test3.jpg D:\Test\Test4.jpg D:\Test\Test5.jpg

這樣能 1 次轉 N 個

最後自動建立 D:\Test\Test1.txt D:\Test\Test2.txt D:\Test\Test3.txt D:\Test\Test4.txt D:\Test\Test5.txt

z4

peter8777555 avatar Dec 23 '23 06:12 peter8777555

1 次轉 N 個

答:新版本 --path 指令已支持传入多个图片路径,1次转N张图片。不过只能混合输出所有结果,暂不支持 Test1.txt Test2.txt 分开不同文件输出。

命令行 是否不要顯示 UI 窗口

答:可在截图OCR标签页设置中 关闭“弹出主窗口”。

是否能直接建立 F:\Test\2\a4\z1.txt 這樣比較直覺

答:Umi-OCR 无参数 指令本身已有功能(弹出主窗口),故OCR指令必须使用 --path

hiroi-sora avatar Apr 02 '24 16:04 hiroi-sora