はじめ
[環境]
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ではエラーが出ていたのも説明がつきます
あなたの回答
tips
プレビュー