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

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

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

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

Python

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

Q&A

0回答

1283閲覧

「python」threading で subprocess (yt-dlp)するコード exe化(pyinstaller)するとFileNotFoundError: [WinError 2]

AIproject

総合スコア0

PyInstaller

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

Python

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

0グッド

0クリップ

投稿2022/10/27 14:10

編集2022/11/02 17:16

はじめ

[環境]
venv仮想環境
Python 3.10.1
[pip]
yt-dlp 2022.10.4
pyinstaller 5.6.1
ffmpeg-python 0.2.0
[その他]
ffmpeg(環境パス設定済み)

[exe実行環境]
ffmpeg(環境パス設定済み)
??(python3.10デフォルト環境にpip install yt-dlpでなぜかexeのエラーが無くなる)


初めにざっとした説明
作成したコードをターミナル上で動かしている間は問題なく動作しているのですが、
pyinstallerでexe化するとエラーが発生してしまいます。コードを間違えているかexe化を失敗していると思うのですが
exe化とthreadingは今回が初めてで解決方法がよくわからないので教えてくださると助かります。<(_ _)>


下がコードです(見やすくするため簡略化してます)

python

1#yt-dlp_test.py 2import tkinter as tk 3import subprocess 4import threading 5 6def ytdlp(): 7 cmd = "yt-dlp -f wv[ext=webm]+wa[ext=webm]/b --merge-output-format webm --recode-video mp4 \ 8 https://youtu.be/X4ABxxkx6YU" 9 proc = subprocess.run(cmd , stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,shell= False) 10 print("正常>>>"+proc.stdout) 11 print("エラー>>>"+proc.stderr) 12 13thread = threading.Thread(target = ytdlp) 14thread.start() 15 16root = tk.Tk() 17root.title(u"test") 18root.geometry("600x600") 19 20root.mainloop()

処理の重いyt-dlpの影響でGUIが応答なしになっていたので
threadingで処理を分け、yt-dlpはsubprocessを用いて実行しています。

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

このコードをターミナル上で動かすと問題なく動作しました。(。・∀・)ノ゙
しかしpyinstallerでexe化すると下のエラーが発生してしまいました。(っ °Д °;)っ

Exception in thread Thread-1 (ytdlp): Traceback (most recent call last): File "threading.py", line 1009, in _bootstrap_inner File "threading.py", line 946, in run File "yt-dlp_test.py", line 9, in ytdlp File "subprocess.py", line 501, in run File "subprocess.py", line 966, in __init__ File "subprocess.py", line 1435, in _execute_child FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

exe化

exe化には下のコマンドを使いました

pyinstaller yt-dlp_test.py --onefile

エラーからファイルが見つからないと言われているので
exe化でpipのライブラリあたりが取り込めずにexeに失敗してる気がするのですが
pyinstallerの--hidden-importだったりのライブラリ追加方法がわからない初心者なので
教えてください。(>人<;)

ターミナルでは問題なく動いているのですが、そもそもコードが間違っている可能性もあると
思っているのでコードのミスなのかexe化を失敗しているかだけでもわかると助かります。<(_ _)>

進展

エラーの発生している行がyt-dlpのコマンドを実行をしている部分なのでyt-dlpライブラリを
取り込めずにexe化してしまった結果エラーが発生していると考え、
試しに別PCで pip install yt-dlp を行いエラーが出ていたexeを動かすと
正常に動作しました。q(≧▽≦q)
pip uninstall yt-dlp でまたエラーが発生するようになったのでexe化で
yt-dlpライブラリが同梱できていないようです。
これで問題解決に大きく近づきました(๑•̀ㅂ•́)و✧


というわけでexe化のやり直しです
調べると--hidden-importでライブラリ名を指定すると同梱できるみたい??
--hidden-import yt-dlpではコンパイルでエラーが出ていました
コマンドではyt-dlpですがパッケージの中ではライブラリファイル名はyt_dlpになってました
(気づくのに時間がかかった…(⊙_⊙;))

5093 INFO: Analyzing hidden import 'yt-dlp' 5094 ERROR: Hidden import 'yt-dlp' not found

yt-dlpからyt_dlpに直してやり直し
--hidden-import yt_dlpでコンパイルするとエラーは発生しませんでした
しかしexe実行してみると前と同じエラーが…

Exception in thread Thread-1 (ytdlp): Traceback (most recent call last): File "threading.py", line 1009, in _bootstrap_inner File "threading.py", line 946, in run File "yt-dlp_test.py", line 9, in ytdlp File "subprocess.py", line 501, in run File "subprocess.py", line 966, in __init__ File "subprocess.py", line 1435, in _execute_child FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

--hidden-import ではだめのようです。(::>_<::)
--hidden-importの使い方がよくわからないので誰か教えてください。<( _ _ )>

原因予測

exeを実行するPCのデフォルト環境にpip install yt-dlpすることでエラーが無くなり問題なく動作することから
①exe化でライブラリの同梱に失敗してる
②exe化するとライブラリを同梱してもライブラリが呼び出せないコードの書き方をしている
また予測が正しければ.pyファイルで問題なく動作してexeではエラーが出ていたのも説明がつきます

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問