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

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

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

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

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

Q&A

解決済

1回答

714閲覧

PYInstallerでEXE化(アプリ化)したのだが、自分のPC上だと実行できるのに他のPCで実行するとモジュールパス関連のエラーが起きてしまうのを解決したい(エラー原因:環境変数PATHの設定)

hamayara2

総合スコア2

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

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

0グッド

0クリップ

投稿2023/12/26 04:31

編集2024/01/09 06:37

実現したいこと

-PYInstalleで作ったアプリが他のPCでもエラーが起きないような
自作モジュール(image_recognition.py、converter.py)とpdf2imageモジュールの
パスの指定のやり方を知りたい。

前提

今私はPythonで
1:PySimpleGUIでアプリの画面を作り、
2:手動でPDFを選択して「画像認識」ボタンを押せば
3:自動でPDFを画像(PNG)に変換して、
4:Tesseractで画像認識するというものを作っています。
とりあえずプログラムの方は一旦区切りがついたので、
PYInstallerでEXE化して、他の人のPCでも動かせるようにしようと思ったのですが、
エラーが発生し上手くいきません。エラーの内容的にモジュールのパスの指定が原因だとは思いますが....
どう直せばいいのか自分で調べても分からなかったため、質問させていただきました。

一応プログラムは全文載せてますが、パス指定のあたりは
「====」で区切っています。

まず前提としては自分PC上で作ったアプリを実行すると、
アプリ画面が表示され、ボタンを押せば画像認識が実行され正常に動作しました。
そして他のPCの場合だとアプリ画面の表示までは大丈夫ですが、
ボタンを押すと以下のようなエラーが発生し、強制終了してしまいます。

※pdf2imageに必要だと聞いたpopplerはEXE化するAPP.pyと同じディレクトリ内に保存しています。

フォルダ名:APP (アプリ用データの保存場所)
↓→App.py (EXE化するファイル)
↓→image_recognition.py (自作モジュール)
↓→converter.py (自作モジュール)
↓→フォルダ名:poppler-23.10.0 (popplerデータが入っているフォルダ)

発生している問題・エラーメッセージ

エラーメッセージ Traceback (most recent call last): File "pdf2image\pdfimage.py",line568,in pdfinfo_from_path File "subprocess.py",line 1026,in_init_ File "subprocess.py",line1538,in execute_child PermissionError:[WinError 5]アクセスが拒否されました。 During handling of the above exception,another exception occurred: Traceback (most recent call last): File "APP.py",line43,in <module> File "image_recognition.py",line 36,in recogntion File "converter.py",line41,in pdfhenkan File "pdf2image\pdfimage.py",line127,in convert_from_path File "pdf2image\pdfimage.py",line 594,in_pdfinfo_from_path pdf2image.exceptions.PDFInfoNotInstalledError:Unable to get page count.IS poppler installed and PATH? [5636]Failed to execute script 'APP' due to unhandled exception!

該当のソースコード(EXE化するメインモジュール APP.py)

============================== ソースコード import PySimpleGUI as sg import gazou_APP.kensaku as ken import gazou_APP.image_recognition as rec ============================== def execute(moji,value): msg = "検索文字「"+moji+"」があるファイルは\n"+value + "\nです。" window["text1"].update(msg)#取得した変数データを使って、text1の文字を更新しています。 def make_main(): # ------------ メインウィンドウ作成 ------------ main_layout = [[sg.Text("あなたの名前は?"), sg.Input("お名前", key="input1")], [sg.Button("画像認識実行", size=(20,1), pad=(5,15)),sg.Input(".", key="infolder"),sg.FolderBrowse("選択")], [sg.Button("検索", size=(20,1), pad=(5,15)), sg.Input("検索文字", key="input2")], [sg.Button("終了", size=(20,1), pad=(5,15), button_color=('white', 'red'), font=('Arial',15))], [sg.Multiline(key="text1", size=(64,20))]] return sg.Window("図面検索アプリ", main_layout,font=(None,14),finalize=True) def make_sub(): # ------------ サブウィンドウ作成 ------------ sub_layout = [[sg.Text("本当に終了しますか?")], [sg.Button("はい")], [sg.Button("いいえ")]] return sg.Window("サブウィンドウ", sub_layout,font=(None,14),finalize=True) def make_sub2(): # ------------ サブウィンドウ2作成 ------------ sub2_layout = [[sg.Text("画像認識終了")], [sg.Button("OK")]] return sg.Window("サブウィンドウ", sub2_layout,font=(None,14),finalize=True) # 最初に表示するウィンドウを指定する。 window = make_main() while True: event, values = window.read() if event == None: break if event == "画像認識実行": rec.recognition(values["infolder"])#valuesで入力文字を入手 sub2_window = make_sub2() while True: event, values = sub2_window.read() if event == None: break if event == "OK": sub2_window.close() sub2_window.close() if event == "検索": moji1=values["input2"] moji2=ken.kensaku(values["input2"]) execute(moji1,moji2) if event == "終了": sub_window = make_sub() while True: event, values = sub_window.read() if event == None: break if event == "はい": sub_window.close() window.close() if event == "いいえ": sub_window.close() sub_window.close() window.close()

該当のソースコード(pdf2imageを使用しているモジュール)

ソースコード # このプログラムは特定のファイルのPDFをPNGに全変換する関数です。 import glob import os from pathlib import Path from pdf2image import convert_from_path import shutil import tag2 as t2 hozon="" def pdfhenkan(file2): #今までの手法 # poppler/binを環境変数PATHに追加する # poppler_dir = Path(__file__).parent.absolute() / "poppler/bin" # os.environ["PATH"] += os.pathsep + str(poppler_dir) #インストールしたPopplerのパスを環境変数「PATH」へ追記する。 #OS自体に設定してあれば以下の2行は不要 ============================== path = os.getcwd() #exe実行ディレクトリpathを取得するのが重要 TESSERACT_PATH = path + '/poppler-23.10.0/Library/bin' #今回はexeと同じディレクトリに配置させる前提とする TESSDATA_PATH = path + '/poppler-23.10.0/Library/bin/pdfinfo' #pdfinfoのpath os.environ["PATH"] += os.pathsep + TESSERACT_PATH os.environ["PYTHONPATH"] = TESSDATA_PATH ============================== #指定の名前のファイル(PDFファイル)を取り出す a = glob.glob(file2+'/**/*.pdf', recursive=True)#ファイルの選択 count1=(len(a)) #変換するファイルの要素数 count2=0 #変換するファイルの選択用 img=0 #繰り返す回数を決める用 print('PDF:'+str(count1)) file_name4="" while img < count1: #aの要素数まで繰り返す file_name=a[count2] #aから順番にファイル名を取り出す pdf_path = Path(file_name) # PDFファイルのパス pages = convert_from_path(str(pdf_path), 150)# PDF -> Image に変換(150dpi) # 画像ファイルを1ページずつ保存 image_dir = ('1_PDF→PNG変換') image_dir2=Path(image_dir)# 画像ファイルを保存するファイルを選択 for i, page in enumerate(pages): file_name2 = pdf_path.stem + "_{:02d}".format(i + 1) + ".png" file_name3 = pdf_path.stem + "_{:02d}".format(i + 1) image_path = image_dir2 / file_name2 # pngで保存 page.save(str(image_path), "png") print(image_path) count=i # ページ枚数 file_name4=file_name4+","+file_name3 abc=t2.set_tag(str(pdf_path),file_name4)#データーベースに結果を保存 test = str(image_path) src = pdf_path dst = '処理済みPDF' shutil.copy2(src, dst) img=img+1 count2=count2+1 print('PDF→PNG end') #メインの処理 def main(): pdfhenknan() if __name__ == "__main__": main()

試したこと

一応
https://qiita.com/ku_a_i/items/76f5fb34279ce3aa6e99
の「2-1.プログラムのPath指定部分を変更する」を見様見真似でやってみましたが、
失敗し、どうすればいいのかよく分かりませんでした。

補足情報(FW/ツールのバージョンなど)

Windows 10 Pro for Workstation
Python 3.12.1
pdf2image 1.16.3
poppler 23.10.0

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

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

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

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

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

hiroki-o

2023/12/26 07:00

こちらの環境ではエラーが再現しない(問題無く動作している)のですが、2点確認させてください。 実行環境(他人PC)で、exeを配置したフォルダーにpoppler-23.10.0フォルダーをコピーしていますか? File "converter.py",line40,in pdfhenkanの行は、 pages = convert_from_path(str(pdf_path), 150)# PDF -> Image に変換(150dpi) の行ですか?
hamayara2

2023/12/26 07:39

>実行環境にpoppler-23.10.0フォルダーをコピーしていますか? はい。自分で使っているものをそのままコピーしています。 >File "converter.py",line40,in pdfhenkanの行は~の行ですか? すみません。1行ずれていました。もう一度確かめましたが、 pages = convert_from_path(str(pdf_path), 150)# PDF -> Image に変換(150dpi) のことで合っています。
hamayara2

2023/12/26 07:50 編集

>hiroki-o さん ご協力ありがとうございます。 少しお聞きしたいのですがエラーの再現出来なかったというのは、上記の方法でpdf2imageを使用したプログラムをアプリ化しても別に 「IS poppler installed and PATH?」 のようなpopplerのパスが不明などのエラーが発生しなかったという認識でいいのでしょうか?
hiroki-o

2023/12/26 08:20

2個目のソースから、PATHを通すところからwhile文にてconvert_from_path呼び出しとカウントアップを抜き出して、テストプログラムを作成しました。 pyinstaller test.py --onefileで実行ファイルを作成後、他のPCで実行したところ、そのエラーが出たので、poppler-23.10.0フォルダーをコピーしました。すると、問題無く実行できました。 (PDFのワイルドカード展開と、convert_from_path呼び出しは問題無い。実際に変換されたかどうかまでは確認していません) なので、現時点で言えるのは ・PATHの通し方は正しいです。 ・poppler-23.10.0フォルダーの場所は正しいか?アクセス権はあるか? ・PDFが置いてあるパスは正しいか?アクセス権はあるか? くらいですね。
hamayara2

2023/12/26 08:42

丁寧な回答ありがとうございます それを参考にパスやアクセス権がどうなっているのか確かめてみようと思います
hamayara2

2023/12/27 01:57

すいません。その実行ファイルは自分のPC(実行ファイルを作成に使用したPC)上でpoppler-23.10.0フォルダーが無い場合だとエラーは起きますでしょうか? 只今私はhiroki-oさんのを参考に別途にテスト用のを準備し(一応後半にプログラムを載せます)、 1:アプリ化前を自分のPC上で実行 2:自分のPC内にあるアプリを自分のPC上で実行 3:共有ネットワーク上にあるアプリを自分のPC上で実行(アプリがあるディレクトリ内にpopplerフォルダーなし) 4:共有ネットワーク上にあるアプリを自分のPC上で実行(popplerフォルダーあり) 5:共有ネットワーク上にあるアプリを他のPC上で実行(popplerフォルダーなし) 6:共有ネットワーク上にあるアプリを他のPC上で実行(popplerフォルダーあり) 7:他のPC内にあるアプリを他のPC上で実行 のように場合分けして、実行したのですが結果としては1~4はエラーなし、5~7は上記と同じエラーありという結果になり、自分PC上ではpoppler-23.10.0フォルダーの有無に関わらず実行でき、他のPCではpopplerがあっても実行できないという結果になってしまいました。 一応プログラム内にprint(os.path.abspath(pdf2image.__file__) )を追加して、 パスが見れないか試しましたが、基本は以下の通りになりました。 アプリ化前:C:\Users\***(PC名)\AppData\Local\Programs\Python\Python312\Lib\site-packages\pdf2image\__init__.py アプリ化後:・C:\Users\****(PC名)\AppData\Local\Temp\_MEI207882\pdf2image\__init__.pyc os.path.abspathで見ても自分と他のPCのパスがほぼ同じなのに何故結果が違うのか分かりませんでした....
hamayara2

2023/12/27 02:01 編集

アプリ画面を出す用(これは問題なく動く) *************** import PySimpleGUI as sg import os import converter #PDFを画像(PNG)に変換する関数 import pdf2image print("converterのパス") print(os.path.abspath(converter.__file__) ) print("pdf2imageのパス1") print(os.path.abspath(pdf2image.__file__) ) def make_main(): # ------------ メインウィンドウ作成 ------------ main_layout = [[sg.Text("あなたの名前は?"), sg.Input("お名前", key="input1")], [sg.Button("画像認識実行", size=(20,1), pad=(5,15)),sg.Input(".", key="infolder"),sg.FolderBrowse("選択")], [sg.Button("検索", size=(20,1), pad=(5,15)), sg.Input("検索文字", key="input2")], [sg.Button("終了", size=(20,1), pad=(5,15), button_color=('white', 'red'), font=('Arial',15))], [sg.Multiline(key="text1", size=(64,20))]] return sg.Window("図面検索アプリ", main_layout,font=(None,14),finalize=True) # 最初に表示するウィンドウを指定する。 window = make_main() while True: event, values = window.read() if event == None: break if event == "画像認識実行": print("開始") converter.pdfhenkan() if event == "終了": window.close() window.close() *************** pdf2imageを使う用(他のPCだとエラーが起こる) *************** # このプログラムは特定のファイルのPDFをPNGに全変換する関数です。 import glob import os from pathlib import Path from pdf2image import convert_from_path import pdf2image def pdfhenkan(): #今までの手法 # poppler/binを環境変数PATHに追加する # poppler_dir = Path(__file__).parent.absolute() / "poppler/bin" # os.environ["PATH"] += os.pathsep + str(poppler_dir) #インストールしたPopplerのパスを環境変数「PATH」へ追記する。 #OS自体に設定してあれば以下の2行は不要 path = os.getcwd() #exe実行ディレクトリpathを取得するのが重要 TESSERACT_PATH = path + '/poppler-23.10.0/Library/bin' #今回はexeと同じディレクトリに配置させる前提とする TESSDATA_PATH = path + '/poppler-23.10.0/Library/bin' #pdfinfoのpath os.environ["PATH"] += os.pathsep + TESSERACT_PATH os.environ["PYTHONPATH"] = TESSDATA_PATH print("pdf2imageのパス2") print(os.path.abspath(pdf2image.__file__) ) print(os.environ["PYTHONPATH"]) #指定の名前のファイル(PDFファイル)を取り出す a = glob.glob(path+'**/*.pdf', recursive=True)#ファイルの選択 print(a) count1=(len(a)) #変換するファイルの要素数 count2=0 #変換するファイルの選択用 img=0 #繰り返す回数を決める用 while img < count1: #aの要素数まで繰り返す file_name=a[count2] #aから順番にファイル名を取り出す pdf_path = Path(file_name) # PDFファイルのパス pages = convert_from_path(str(pdf_path), 150)# PDF -> Image に変換(150dpi) img=img+1 print("終了") #メインの処理 def main(): pdfhenkan() if __name__ == "__main__": main() ***************
hiroki-o

2023/12/27 03:26

3台目の環境が無いので5、6は試していませんが、自PC/他PC問わず、popplerフォルダー有りでは動作して、無しではエラーになります。 ・自PCで新たにコマンドプロントを立ち上げて、pathと叩いたときにpopplerフォルダーは存在しますか?(環境変数に設定しているのでは、という確認) ・エラーになるときのメッセージは、全部「PermissionError:[WinError 5]アクセスが拒否されました。」でしょうか?「FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。」が出るパターンは、ありますか?(popplerフォルダーの有無が原因なら後者になる、という確認)
hamayara2

2023/12/27 04:28 編集

>自PCで新たにコマンドプロントを立ち上げて、pathと叩いたときにpopplerフォルダーは存在しますか? コマンドプロンプトで「path」を実行すると、 C:\Program Files (x86)\poppler-23.10.0\Library\bin; というものがあるのが確認できました。 デスクトップから行ける「システム環境変数の編集」でしか環境変数を見ておらず、それではpopplerが無かったので完全に見落としてました.... 環境変数から削除して、動くかどうか試してみます。 >エラーになるときのメッセージは、全部「PermissionError:[WinError 5]アクセスが拒否されました。」でしょうか? はい。今までのエラー画面を確認しましたが全部同じでした。
hamayara2

2023/12/27 07:41

追記:「システム環境変数の編集」はユーザの環境変数しかみておらず、システム環境変数の方は見ていなかったから気が付きませんでした
hamayara2

2023/12/28 04:47

結果報告が遅くなり申し訳ございません。 まだ他のPCだと「PermissionError:[WinError 5]アクセスが拒否されました。」&「IS poppler installed and PATH?」というエラーが出るものの、環境変数からpoppler-23.10.0のパスを消すことで自PC上でもpoppler-23.10.0フォルダが無いとエラーが起こるようになり、アプリ内の参照先がアプリと同じディレクトリ内にあるpoppler-23.10.0フォルダに変わったのが確認できました。 hiroki-oさんのお陰で大分前進できたと思います。ありがとうございます。 私のアプリの移動方法としては 自PC→共有ネットワーク内にあるフォルダ→他PC という経路を辿っており、共有ネットワーク内にあるpoppler-23.10.0フォルダのセキュリティを見ると、自分以外のユーザは読み取りと書き込みしかアクセス許可がありませんでした。 とりあえずこれ関連が原因だと仮定して、アクセス許可の設定を変えていますが中々上手くいってません.... お手数をおかけしますがどうやって自PCから他PCにアプリを移動しているのか聞いてもいいでしょうか?
hiroki-o

2023/12/28 05:24

他PCに共有フォルダーの設定をして、自PCからLAN経由でコピーしています。特にアクセス権等は、いじっていません。 自PCのPythonとC:\Program Files (x86)\popplerとコピーしようとしているpopplerの64/32bitが合っていないせいでは?という推測のもとに環境構築をしている最中でしたが、自PCで動作しているのなら、その心配は無さそうですね...
hamayara2

2023/12/28 05:51

お返事ありがとうございます。 自PCで使っているpopplerをそのまま共有ネットワークにあるアプリ用フォルダにコピー&ペーストで移動してるので、内容は同じはずなんですが.... 一度他PCに直接poppler-23.10.0をダウンロードして動かないか試してみることにします。
hiroki-o

2023/12/28 06:02

全然関係無いかもしれませんが、念のために確認させてください。 ・自PCのPython ・poppler ・他PCのWindows は、全部64bitですか?
jbpb0

2023/12/28 08:53

実行できない他のパソコンのコマンドプロンプトで、 「どこか/poppler-23.10.0/Library/bin」 にあるコマンドを、たとえば pdfinfo -listenc のように直接実行したら、どうなるのでしょうか? 「どこか/poppler-23.10.0/Library/bin」 が環境変数「PATH」に含まれてないなら、絶対パスを付けてコマンドを実行してみてください
hamayara2

2023/12/28 12:12

jbpb0さん。コメントありがとうございます すいません。ちょっと物理的にPCが使えない状況なので実行するのは年明けになってしまいます。 (私物ではないので…) コマンドプロンプトで直接アクセス出来るか確かめる発想がなかったのでありがたいです。 hiroki-oさん。jbpb0さん。 わざわざお付き合いありがとうございます。良いお年を
hamayara2

2023/12/28 12:20

追記: 他PCに直接poppler-23.10.0をダウンロードしましたが同じアクセスエラーが起きました 年明けに自PCの環境パスを再度確かめるつもりです
jbpb0

2023/12/28 14:06

この質問の内容とは関係無いかもしれませんが、 > TESSDATA_PATH = path + '/poppler-23.10.0/Library/bin/pdfinfo' > os.environ["PYTHONPATH"] = TESSDATA_PATH は、必要なのでしょうか? 「TESSDATA_PATH」でググったら、この質問のコードとは違い、 https://qiita.com/ku_a_i/items/93fdbd75edacb34ec610 とかのように、「tesseract-ocr」の「tessdata」というディレクトリの絶対パスを環境変数「TESSDATA_PREFIX」に登録するのに使われてるコードは、いくつか見つかります この質問のコードのように、「poppler」の「pdfinfo」コマンドの絶対パスを環境変数「PYTHONPATH」に登録するのは、何かを参考にしたのでしょうか?
hamayara2

2023/12/28 15:47

https://qiita.com/ku_a_i/items/76f5fb34279ce3aa6e99 の「2-1.プログラムのPath指定部分を変更する」を参考にしました。 正直良くわかっていないですけど、EXE化する時に、Path(__file__)だとエラーが起こるとか聞いたのでこれを見様見真似でそれっぽいのを作った感じです。
jbpb0

2023/12/29 02:17

> https://qiita.com/ku_a_i/items/76f5fb34279ce3aa6e99 の「2-1.プログラムのPath指定部分を変更する」を参考 のコードと、 https://qiita.com/ku_a_i/items/20004800adc78fa94a0b の「3. ボタンアクションを追加する」 のコードを見比べたら分かりますが、「TESSDATA_PATH」に関する行はPyInstallerでexe化する前の普通のpythonコードの時と同じですから、それらの行はPyInstallerでexe化するかどうかとは無関係に、上記webページの内容でのTesseractでの処理で元々必要なものです この質問のコードの場合も、PyInstallerでexe化する前の普通のpythonコードの状態でそれらの行が必要(無いと実行できない)なら、もちろんexe化するコードでも必要ですが、実際そうなのでしょうか? 「TESSERACT_PATH」に関する行で 「どこか/poppler-23.10.0/Library/bin」 の絶対パスを正しく環境変数「PATH」に登録するだけで大丈夫で、「TESSDATA_PATH」に関する二つの行は要らないような気がします それらの行が有ってもexe化に使ったパソコンでは実行できてるので、(要らなくても)有っても問題無いはずなので、質問内容が解決した後にでも、それらの行を削除したらどうなるのか試したらいいと思います
hamayara2

2023/12/29 13:15

おっしゃる通り os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH とかは無くても動きそうですけど、一応同じような形の方が良いかと思ってそのまま使ってました (なんか普通にEXE化出来て動いてたので優先度が低かった) 一応これも原因?かもしれないので消しても動くかどうか試してみます。
hamayara2

2024/01/05 02:49 編集

とりあえず自PC内、他PC内、共有ネット内(接続元:自PC、他PCの2パターン) にあるpoppler-23.10.0フォルダで **** pdfinfo -listenc *** を実行しましたが、 いずれも ***** Available encodings are: . .. ASCII7 Big5 Big5ascii EUC-CN EUC-JP GBK ISO-2022-CN ISO-2022-JP ISO-2022-KR ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 KOI8-R Latin1 Latin2 Shift-JIS Symbol TIS-620 UTF-16 UTF-8 Windows-1255 ZapfDingbats ***** という結果に終わり、アクセスエラーなどは起きませんでした。 なのでコマンドプロンプト上だと他PCでも動かすことは出来そうです。 また、os.environ["TESSDATA_PREFIX"] = TESSDATA_PATHの部分は削除しましたが、 普通に動きました。(エラーの変化もなし)
hamayara2

2024/01/05 03:02

hiroki-oさん お時間があるときで良いのですが、 *** os.environ["PATH"] += os.pathsep + TESSERACT_PATH *** の後ろに *** print(os.environ["PATH"]) *** を追加したとき、自PCと他PCでは結果が異なるのでしょうか? 私の場合は *** 【自PCの場合】 C:\Program Files (x86)\Windows Resource Kits\Tools\; C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common; C:\Program Files (x86)\Intel\iCLS Client\; C:\Program Files\Intel\iCLS Client\; C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem; C:\WINDOWS\System32\WindowsPowerShell\v1.0\; C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL; C:\Program Files\Intel\Intel(R) Management Engine Components\DAL; C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT; C:\Program Files\Intel\Intel(R) Management Engine Components\IPT; c:\Program Files (x86)\HP\HP Performance Advisor; C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\; C:\Program Files (x86)\NAiS MEWNET; C:\WINDOWS\System32\OpenSSH\; C:\Program Files\Microsoft SQL Server\110\Tools\Binn\; C:\Program Files (x86)\Windows Live\Shared; C:\Program Files\Git\cmd; C:\Users\****(PC名)\AppData\Local\Programs\Python\Python312\Scripts\; C:\Users\****(PC名)\AppData\Local\Programs\Python\Python312\; C:\Users\****(PC名)\AppData\Local\Programs\Python\Python311\Scripts\; C:\Users\****(PC名)\AppData\Local\Programs\Python\Python311\; C:\Users\****(PC名)\AppData\Local\Microsoft\WindowsApps; C:\Users\****(PC名)\AppData\Local\Programs\Microsoft VS Code\bin;; C:\Users\****(PC名)\Desktop\****(アプリがあるフォルダ名)/poppler-23.10.0/Library/bin *** *** 【他PCの場合】 C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common; C:\Program Files\Common Files\Microsoft Shared\Windows Live; C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live; c:\Program Files (x86)\Intel\iCLS Client\; c:\Program Files\Intel\iCLS Client\; C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem; C:\WINDOWS\System32\WindowsPowerShell\v1.0\; C:\Program Files\Intel\Intel(R) Management Engine Components\DAL; C:\Program Files\Intel\Intel(R) Management Engine Components\IPT; C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL; C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT; c:\Program Files (x86)\Hewlett-Packard\HP Performance Advisor; C:\Program Files (x86)\Windows Live\Shared; C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\; C:\PCBIND32; C:\windows\DPSYS; C:\MROOT\BIN; C:\WINDOWS\DPSYS; C:\WINDOWS\System32\OpenSSH\; C:\Users\****(PC名)\AppData\Local\Microsoft\WindowsApps; ****(共有ネットワーク名)\アプリがあるフォルダ名\poppler-23.10.0\Library\bin;; C:\Users\sekkei\Desktop\アプリがあるフォルダ名/poppler-23.10.0/Library/bin *** とゆう結果になり、自PCと他PCでは表示される結果が異なりました。 特に自PCと他PCともに共有ネットからアプリを入手して、 実行しているのに、他PC場合のみ最後の方に ****(共有ネットワーク名)\アプリがあるフォルダ名\poppler-23.10.0\Library\bin;; のように共有ネットの名前がパス内に含まれていました。 これはhiroki-oさんでも同じことが起きるのか、私だけの問題なのか分からないため、 検証をお願いしたいです。
hamayara2

2024/01/05 05:38

追記: 調べたら C:\Users\****(PC名)\AppData\Local\Programs\Microsoft VS Code\bin;; などは環境変数らしいので、可能であればアプリ化を行ったPCの環境変数の設定を教えてくれるとありがたいです。
hiroki-o

2024/01/05 06:02

環境変数というか、pathを叩いたそのままですよ。 C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin; C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem; C:\WINDOWS\System32\WindowsPowerShell\v1.0\; C:\WINDOWS\System32\OpenSSH\; C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL; C:\Program Files\Intel\Intel(R) Management Engine Components\DAL; C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common; C:\Program Files\nodejs\; C:\Program Files\Amazon\AWSCLIV2\; C:\Program Files\Docker\Docker\resources\bin; C:\ProgramData\DockerDesktop\version-bin; C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem; C:\WINDOWS\System32\WindowsPowerShell\v1.0\; C:\WINDOWS\System32\OpenSSH\; C:\Program Files\Graphviz\bin; C:\Program Files\dotnet\; C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Python312\Scripts\; C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Python312\; C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Launcher\; C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Python38-32\Scripts\; C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Python38-32\; C:\Users\xxxxxxxx\AppData\Local\Microsoft\WindowsApps; C:\Users\xxxxxxxx\AppData\Roaming\npm; C:\Users\xxxxxxxx\.dotnet\tools; F:\data\teratail\jdk-21.0.1\bin;
hiroki-o

2024/01/05 06:03

で、最初の質問結果です。※こちらではpoppler-23.11.0で確認しています 自PC 自PCのpath;F:\data\teratail/poppler-23.11.0/Library/bin 自PCから他PCのexe実行 自PCのpath;\\mypc3\temp\APP/poppler-23.11.0/Library/bin 他PC 他PCのpath;C:\temp\APP/poppler-23.11.0/Library/bin で、3パターンともexeと同じ場所のpopplerを追加して、正常実行できています。 print(os.environ["PATH"])の出力は、元のpathと追加したpathの間に「;」が1個余計に入るみたいなので、 ****(共有ネットワーク名)\アプリがあるフォルダ名\poppler-23.10.0\Library\bin; は、もともと他PCのpathに含まれていると推測されます。ご確認ください。
hamayara2

2024/01/05 06:57 編集

print(os.environ["PATH"])はそのままPC内にあるPath情報を表示してるだけだから、PCによって結果が違ったんですね。関数の意味を理解してませんでした。 回答ありがとうございます。 確認してみます
hamayara2

2024/01/05 07:09

現時点ではまだエラー探し用の簡易版の方でしか確かめてませんが、他PC内のパスにある ****(共有ネットワーク名)\アプリがあるフォルダ名\poppler-23.10.0\Library\bin; を削除したら、アクセス拒否エラーがなくなり正常に動作するようになりました。 ありがとうございます。
hamayara2

2024/01/05 08:15

メインのアプリでも同様の操作で動作することが確認できました。 どうやら設定した覚えはないのですが自PCだけでなく、他PCの方でもpopplerが環境変数に設定されていたため、アクセスエラーが起きていたようです.... お陰でさまで解決することができました。 結論としましては ・パスの設定方法は合っていた ・アプリ化前・アプリ実行前からPC内のPath(環境変数)に「poppler-23.10.0」のパスがあったため、アクセスエラーが起きていた。 (自PCと他PCのそれぞれにpopplerパスが環境変数に設定されていた) ※解決法 「デスクトップ」→「システムプロパティ」→「環境変数」 で「ユーザ環境変数」と「システム環境変数」を確かめて、自PCと他PCのPathから「poppler-23.10.0」に関するパスを削除することで、アクセスエラーを解消。 EXE化(アプリ化)するときは環境変数に使用するモジュールのパスが設定されていないか確かめる。 という感じになりました。 hiroki-oさん。長々とお付き合いありがとうございます。 出来ればベストアンサーの選びたいので、回答していただけると幸いです。
guest

回答1

0

ベストアンサー

Windows 11、Python 3.12.1で確認しました。

このソースでは、以下の方法で実行ファイルと同じフォルダーにある/poppler-23.10.0/Library/binフォルダーを、環境変数PATHに追加しています。

path = os.getcwd() #exe実行ディレクトリpathを取得するのが重要 TESSERACT_PATH = path + '/poppler-23.10.0/Library/bin' #今回はexeと同じディレクトリに配置させる前提とする os.environ["PATH"] += os.pathsep + TESSERACT_PATH

この場合、環境変数PATHに、もともと別の場所の/poppler-23.10.0/Library/binが設定されていた場合、そちらのpopplerを優先して使用します。
そのpopplerが何らかの理由でアクセスできない場合、「アクセスが拒否されました。」エラーになります。

対処方法としては、環境変数PATHから別の場所のpopplerを取り除いて、常にソース側で設定したパスのpopplerを使用するようにします。

環境変数PATHの編集は、「設定の検索」にて「環境変数」を入れて表示される設定画面で実施します。

投稿2024/01/05 13:49

hiroki-o

総合スコア483

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

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

hamayara2

2024/01/09 06:36

回答ありがとうございます。 私1人だとPATHの設定のところで止まり、環境変数のとこまで辿り着けませんでした。 hiroki-oさんのお陰でアプリのエラーの原因が分かり、開発が進められそうです。 深く感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問