実現したいこと
pythonのsubprocess.Popenを使い、実行ファイルを起動し
起動終了を待たずに、pythonプログラムを終了する
前提
pythonでuwscで作った実行ファイルを起動するプログラムを作っています。
作成したuwscは起動しっぱなしで処理が完了しないが
それを指令するpythonは処理を終了させたく、
subprocess.runではなく、subprocess.Popenを使って実現しようとしましたが
上手くいきません。。。
発生している問題・エラーメッセージ
エラーメッセージなく、起動されず処理が終了する
該当のソースコード
python
1import psutil 2import subprocess 3from subprocess import PIPE 4 5# ここにプログラムの名前を設定 6prg_name = 'UWSC.exe' 7prg_path = r'C:\Users\~\UWSC.exe' 8code_path = r'"C:\Users\~\aaa.uws"' 9 10# プログラムを起動する関数 11def call_process(): 12 try: 13 cmd = [prg_path, code_path] 14 subprocess.Popen(cmd) #, shell=True, stdout=PIPE, stderr=PIPE, text=True) 15 except FileNotFoundError: 16 print(f"{prg_path}が見つかりません。") 17 except Exception as e: 18 print(f"エラーが発生しました: {e}") 19 20# メイン関数 21def main(): 22 call_process() 23 24if __name__ == "__main__": 25 main()
試したこと
補足情報(FW/ツールのバージョンなど)
python 3.10.5
uwscってことはwindowsですよね?
startコマンドを使えばいいのではないでしょうか?
batファイルでもいけますが、pythonならこんな感じ
import subprocess
def call_process():
try:
subprocess.run(['start', 'pause'], shell=True, check=True)
except Exception as e:
print(f"エラーが発生しました: {e}")
if __name__ == "__main__":
call_process()
Pythonのバージョンを明記してください (このコメント欄に書くのではなく、質問文を編集して書いてください)。
実行手順も提示ください。
こちらの環境ではコマンドプロンプト上での.py実行にて
Popenで問題なくUWSC起動してPythonは終了しました。
皆さんはあまり気にならないようなんですが、私はpopenでリソースリークしないかがちょっと気になります。どの程度の問題が起きるのかよく知りませんけど。。。
一言で言うと
with subprocess.Popen(某) as p:
だと綺麗に終われない気がするんですよ。
プロセス自体が終了するので考え過ぎな気もするけど、こういう穴はなんか気になります。
リソースリークというのはよくわからないですけど、SIGCHLDを処理しなくていいのかは気になります。WindowsにPython入れてないので試してないですが。
具体的なリソースやリークケースは分かりませんが
なんとなくですがWindowsはforkがないので大丈夫だと感じます。
なるほど。ドキュメントにもWindowsではspawn相当の動作だと書いてありました。
子プロセス側の心配じゃないですが。。。
例えばこういうことですね。
import subprocess
def call_process_popen():
try:
with subprocess.Popen(['notepad'], start_new_session=True) as p:
p.wait(0)
except Exception as e:
print(f"エラーが発生しました: {e}")
if __name__ == "__main__":
call_process_popen()
リソースリークがないことを保証するために、withを使うと、子プロセスが終了するまで抜けられないのですよ。