15

Python スクリプトからプロセス (たとえば、別の Python スクリプト) を開始して、「子」プロセスが「親」から完全に切り離されるようにするにはどうすればよいですか? b) 子プロセスを終了せずに終了できるか?

親:

import os

print "Parent started"
os.system("./child.py")
print "Parent finished"

子:

import time

print "Child started"
time.sleep(10)
print "Child finished"

実行中parent.pyの印刷物:

Parent started
Child started
Child finished
Parent finished

印刷したいもの:

Parent started
Child started
Parent finished
(seconds later)
Child finished
4

3 に答える 3

11

あなたが言及したので、「忘れる」部分を達成するためにwith モードをos.system使用する必要があったことに言及する価値があると思います。os.spawn*P_NOWAIT

ただし、subprocessモジュールは、、などの代替を提供するためos.systemos,spawn*代わりにそれを使用する必要があります

import subprocess
p = subprocess.Popen("./child.py")
print "pid = ", p.pid

os.spawn を subprocess.Popen に置き換えるを参照してください。

コメントで説明したように、両方のプロセスparent.pychild.pyはまだ同じプロセス グループにあるため、端末は信号 ( などCtrl-C) をフォアグラウンド プロセス グループのすべてのプロセスに転送するため、 Ctrl-C. child.pyしたがって、次のようにして新しいプロセスグループに強制的に参加させたくない場合は、次のようにします。

#!/usr/bin/env python
import subprocess
import time
import os
p = subprocess.Popen("./child.py", preexec_fn=os.setsid)
print "pid = ", p.pid
time.sleep(30) # Ctrl-C at this point will not kill child.py
print "parent exit"
于 2014-06-10T06:31:07.100 に答える