🐍
uv run 実行時に subprocess 内で import 処理が失敗する問題について
現在、個人開発を行っており、以下のような環境で Python を利用しております。
本日は、その中で直面したエラーについて、調査の中で分かった原因と対策について共有いたします。
開発環境
- Windows 11
- Python の環境管理を uv にて行う。
発生したエラーの内容
以下のような別の Python スクリプトを呼び出すための main.py を実行したところ、
子プロセスhoge.py 内で定義した import fuga の処理が失敗してしまいました。
処理が失敗したコード例
main.py
import sys
import subprocess
subprocess.run(["python", "hoge.py"])
hoge.py
import fuga # uv 環境のみにインストールされているモジュールをインポートする処理
# (後略)
実行結果
Windows PowerShell において、uv run main.py を実行したところ、以下のようなエラーが発生しました。
Error in hoge.py: Traceback (most recent call last):
File "C:\script\hoge.py", line ××, in <module>
import fuga
ModuleNotFoundError: No module named 'fuga'
原因
上記のエラーは subprocess.run(["python", "hoge.py"]) と指定すると、.venv 上の Python ではなく、PATH で指定した Python を実行してしまうことが原因で発生しておりました。
参考
(前略)
On all platforms, passing sys.executable is the recommended way
to launch the current Python interpreter again,
(後略)
Google 翻訳による日本語訳
(前略)
すべてのプラットフォームにおいて、
現在の Python インタープリターを再度起動するには
sys.executable を渡すことが推奨されます。
(後略)
対策
main.py の処理において、"python" としていた部分を sys.executable に修正することで、.venv 上の Python を指定して実行するようになり、hoge.py 内の import fuga の処理が成功するようになりました。
main.py
import subprocess
import sys
subprocess.run( [sys.executable, "hoge.py"]) # この行を "python" から、"sys.executable" に修正
Discussion