質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

660閲覧

sudoをつけて実行するとエラーになる Python3 pytesseract

taisei12232

総合スコア23

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2024/03/24 21:11

編集2024/03/25 02:05

実現したいこと

エラーを出さずに実行する
原因がわかるだけでも助かります

発生している問題・分からないこと

普通に実行した場合は問題なく動作するのですが、
sudoオプションをつけて実行した場合のみ下記のエラーが発生します。
当該コードで使用している別のライブラリでsudoが必要なので、外せません。

エラーメッセージ

error

1Traceback (most recent call last): 2 File "/Users/user/minhaya/main.py", line 20, in <module> 3 text = pytesseract.image_to_string(img) 4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 5 File "/Users/user/.asdf/installs/python/3.12.2/lib/python3.12/site-packages/pytesseract/pytesseract.py", line 422, in image_to_string 6 return { 7 ^ 8 File "/Users/user/.asdf/installs/python/3.12.2/lib/python3.12/site-packages/pytesseract/pytesseract.py", line 425, in <lambda> 9 Output.STRING: lambda: run_and_get_output(*args), 10 ^^^^^^^^^^^^^^^^^^^^^^^^^ 11 File "/Users/user/.asdf/installs/python/3.12.2/lib/python3.12/site-packages/pytesseract/pytesseract.py", line 287, in run_and_get_output 12 run_tesseract(**kwargs) 13 File "/Users/user/.asdf/installs/python/3.12.2/lib/python3.12/site-packages/pytesseract/pytesseract.py", line 263, in run_tesseract 14 raise TesseractError(proc.returncode, get_errors(error_string)) 15 ^^^^^^^^^^^^^^^^^^^^^^^^ 16 File "/Users/user/.asdf/installs/python/3.12.2/lib/python3.12/site-packages/pytesseract/pytesseract.py", line 155, in get_errors 17 line for line in error_string.decode(DEFAULT_ENCODING).splitlines() 18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 19UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 214: invalid start byte

該当のソースコード

python

1pytesseract.image_to_string(img)

実行環境

Python3.12.2
MacOS Ventura 13.6.5
Apple M1

補足

この現象が起こるようになった原因の心当たりとして、
直前に今までRosettaのhomebrewのpyenvからインストールしていたPythonを、
arm64のasdfからインストールしました。

ライブラリを使わずsubprocessから直接tesseractを実行した場合は、正常に動作しました。

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2024/03/25 01:48

Tracebackを省略しているのでしょうか? それとも本当に1行だけの出力で終わっているのでしょうか?
taisei12232

2024/03/25 01:54

省略していたエラーを全て追記しましたが、解決できますか?
otn

2024/03/25 02:19

エラーメッセージを読む習慣を付けましょう。 エンコーディング変換時のエラーです。UTF-8でないものをUTF-8であるとして処理しようとしている。
taisei12232

2024/03/25 02:21

承知してます。 その上で、 ・なぜsudoをつけるとエラーになるのか ・エラーにならない方法 を質問しています。
otn

2024/03/25 02:41

> 承知してます。 では、その文字列の中味を把握していますか?見れば原因が分かりそうな気がしますが。 また、DEFAULT_ENCODING の値が、ユーザによって異なるのかどうかは確認しましたか?
taisei12232

2024/03/25 02:44

把握できていないから質問しています。 default encodingはsudoの有無に関わらずutf-8でした。
melian

2024/03/25 03:17

現状では DEFAULT_ENCODING の値は 'utf-8' で固定されていて、コード内の decode() には全て DEFAULT_ENCODING が渡されています。 pytesseract/pytesseract/pytesseract.py at master · madmaze/pytesseract · GitHub https://github.com/madmaze/pytesseract/blob/master/pytesseract/pytesseract.py#L50 DEFAULT_ENCODING = 'utf-8' pytesseract から起動される tesseract コマンドが出力するエラーメッセージの文字コードが root で実行する場合には UTF-8 ではない、ということなので、sudo に -E オプション(--preserve-env)を付けるとよいかもしれません。(security policy 次第ですが)
taisei12232

2024/03/25 03:21

コメントありがとうございます!試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
quickquip

2024/03/25 03:23

which tesseract と sudo which tesseract が食い違っている(別のtesseractが呼び出されている)んじゃないかと想像しました
taisei12232

2024/03/25 03:25

そちらは同じでした...
quickquip

2024/03/25 03:29 編集

sudo tesseract イメージ 出力 を試すのが先でしたか…… 動かしているユーザにtesseract関連の環境変数が設定されている(がrootではしていない)とか?
guest

回答4

0

環境変え+sudoの確認の前に、環境変えのみでの確認を実施してください。

投稿2024/03/24 23:38

Refrain

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taisei12232

2024/03/24 23:40

書いている通りsudoをつけない場合は正常に動作します。
guest

0

ベストアンサー

現状では DEFAULT_ENCODING の値は 'utf-8' で固定されていて、コード内の decode() には全て DEFAULT_ENCODING が渡されています。

pytesseract/pytesseract/pytesseract.py at master · madmaze/pytesseract · GitHub

DEFAULT_ENCODING = 'utf-8'

pytesseract から起動される tesseract コマンドが出力するエラーメッセージの文字コードが root で実行する場合には UTF-8 ではない、ということになります。security policy の設定次第ですが、sudo コマンドに -E オプション(--preserve-env)を付けるとよいかもしれません。

投稿2024/03/25 03:27

melian

総合スコア20574

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

把握できていないから質問しています。

言葉足らずですみません。「その文字列の中味を把握していますか?」はYES/NOで応えて欲しかったわけじゃなくて、「把握してないのなら把握しましょう」という意図でした。

エラーメッセージ全体を見ると、エラーを出しているメソッド名からすると、何らかの外部コマンドを実行していて、
・sudoを付けると実行でエラーが出ていて、そのエラーメッセージがおそらくSJIS
・sudo付けないと実行でエラーが出ずに正常実行
という事かと思うので、必要な環境変数が設定できてないあたりが怪しいです。
sudoを使うと、(設定次第ですが)多くの環境変数が伝わりません。

envsudo envの結果を比較して漏れているものの中で明らかに無関係なものを除き、

sh

1#!/bin/sh 2export 漏れている変数名=変数値 3export 漏れている変数名=変数値 4・・・・ 5/path/to/python /Users/user/minhaya/main.py

のようなシェルスクリプトを作って、それをsudoで実行してみましょう。
うまく行けば、変数を減らしてどの変数が必要なのかを確認。

投稿2024/03/25 03:31

otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

https://github.com/madmaze/pytesseract/blob/v0.3.10/pytesseract/pytesseract.py#L415

pytesseract.image_to_string(img, output_type=pytesseract.Output.BYTES)

として、文字列型にdecodeせずバイト型で返してもらって、実際に何が入ってきているのか中身を確認したらいいのでは

投稿2024/03/25 03:06

quickquip

総合スコア11209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問