Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在 Windows 11 運行問題 #274

Closed
peter8777555 opened this issue Dec 18, 2023 · 13 comments
Closed

在 Windows 11 運行問題 #274

peter8777555 opened this issue Dec 18, 2023 · 13 comments

Comments

@peter8777555
Copy link

peter8777555 commented Dec 18, 2023

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 次 的狀態,無法開始 新的 截圖識別.

@hiroi-sora
Copy link
Owner

hiroi-sora commented Dec 19, 2023

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

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


2. 你的症状看起来跟这个旧issue比较相像: hiroi-sora/Umi-OCR_v2#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 。正常情况下应该显示一个系统弹窗。

@peter8777555
Copy link
Author

peter8777555 commented Dec 19, 2023

  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 會 死循環 一直無法識別,只能點擊 停止任務

@hiroi-sora
Copy link
Owner

hiroi-sora commented Dec 20, 2023

感谢测试,信息很有帮助。我推测有可能是您的 繁中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)

@peter8777555
Copy link
Author

peter8777555 commented Dec 20, 2023

z1

@hiroi-sora
Copy link
Owner

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

raise Exception("12543124524")

这一行删掉,再测试。

@peter8777555
Copy link
Author

z2

@hiroi-sora
Copy link
Owner

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

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

@peter8777555
Copy link
Author

peter8777555 commented Dec 20, 2023

我有個疑問:

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

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

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

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

z3

@hiroi-sora
Copy link
Owner

hiroi-sora commented Dec 21, 2023

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

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

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

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

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

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


命令行 參數 報錯

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

@peter8777555
Copy link
Author

peter8777555 commented Dec 21, 2023

感謝說明.

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

另外,
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 個

@hiroi-sora
Copy link
Owner

hiroi-sora commented Dec 22, 2023

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

在 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 added a commit that referenced this issue Dec 22, 2023
非简体中文系统语言时,类似【'cp950' codec can't encode character '\u8bd1' in position 1】的编码错误。
@peter8777555
Copy link
Author

peter8777555 commented Dec 23, 2023

試了 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

@hiroi-sora
Copy link
Owner

1 次轉 N 個

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants