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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Q&A

2回答

3531閲覧

pythonのsubprocess処理実行時に終了処理とかはなくて大丈夫でしょうか

hiroshi77

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2021/12/27 09:48

特に問題に感じたことはなかったのですが、下記のようなsubprocess処理を実行した際、何か終了処理のコードを追加しなくでも問題ないでしょうか。
例えば、backgroundでprocessが走り続けてしまうというような....

python

1import subprocess 2 3command = ["python","test.py","--firstname toya --lastname kenta"] 4 5proc = subprocess.Popen(command)

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

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

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

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

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

guest

回答2

0

サブプロセス呼び出しはOSの機能を呼んでいるだけですので、何が起こるかはOSの問題となります。

Unix系のOSでもWindows NT系のOSでも、親プロセスが子プロセスを生成した後に終了した場合は子プロセスにSIGHUPというシグナルが送られます。シグナルを受け取った子プロセスが終了するかどうかは子プロセスの設定次第です。

詳しいことを知りたければLinuxの「シグナル」って何だろう?nohup コマンドとか、about_Jobをお読みください。

これらを読めばわかるように、subprocess.Popenで実行したいコマンドが「backgroundでprocessが走り続けてしまう」ということは起こそうとして起こすことが可能です。

起こそうとしなくて起きてしまうことがあるかというと、OSにバグがある場合とか、呼び出し側されるコマンドの仕様だったりバグがあったりする場合、呼び出す側が呼び出し方を間違えた場合などには起こる可能性はゼロではありません。
これはPopenであろうがrunであろうが起こります。

長期にわたって再起動せずに動作を続けるサーバ向けのプログラムであれば注意が必要ですが、毎日一回再起動をしているPCの話であればその時にすべてのプロセスは消えますから気にしても仕方がないでしょう。

投稿2021/12/28 03:41

ppaul

総合スコア24670

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

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

hiroshi77

2021/12/28 11:52

なるほどです。参考リンクもお送りいただいて、とても助かります。どうもありがとうございます。
guest

0

Popen オブジェクトは with 文を介してコンテキストマネージャとしてサポートされています:終了時に、標準のファイルディスクリプタは閉じられ、プロセスは待機します。

py

1with Popen(["ifconfig"], stdout=PIPE) as proc: 2 log.write(proc.stdout.read())

https://docs.python.org/3/library/subprocess.html#subprocess.Popen

「例えば、backgroundでprocessが走り続けてしまうというような....」
ということはないと思いますが、with文がサポートされているようですね。

py

1proc = subprocess.Popen(...) 2try: 3 outs, errs = proc.communicate(timeout=15) 4except TimeoutExpired: 5 proc.kill() 6 outs, errs = proc.communicate()

https://docs.python.org/3/library/subprocess.html#subprocess.Popen

例外などの場合を考慮して、kill()など考慮する必要はありそうですね。


サブプロセスを呼び出すには、run() 関数が処理できるすべてのユースケースを使用することをお勧めします。より高度なユースケースのために、基礎となる Popen インターフェースを直接使用することができます。

run() 関数は Python 3.5 で追加されました; もし古いバージョンとの互換性を保つ必要があれば、古い高レベル API のセクションを参照してください。

argsで記述されたコマンドを実行する。コマンドの完了を待って、CompletedProcessのインスタンスを返す。

https://docs.python.org/3/library/subprocess.html#subprocess.run

プロセスの細かい制御がいらないようでしたらrun関数もあるようですね。

投稿2021/12/27 12:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiroshi77

2021/12/27 23:30

ありがとうございます。 なるべくrun関数で代替できなきか検討してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問