2013-08-22 19 views
0

我要尋找一個Python相當於以下內容:Python程序來管理python腳本作爲孩子

until python program.py; do 
    echo "Crashed...Restarting..." >&2 
    sleep 1 
done 

另外,我需要在父程序殺害,當殺program.py。有什麼建議麼?

+0

你能修改program.py嗎? –

+0

嗨尼古拉,你到底想修改program.py?看看下面的答案(來自我)是否有意義。謝謝。 –

回答

0

模塊subprocesspsutil應提供您需要的大部分(如果不是全部)。

import sys, subprocess 
while True : 
    retCode= subprocess.call(["python","program.py"]) 
    if retCode == 0 : break 
    print('Crashed...Restarting...', file=sys.stderr) 
+0

謝謝。子過程的確會成爲一招。我會用代碼寫一個詳細的答案 –

0
#!/usr/bin/python 

import os 
import signal 
import subprocess 
import sys 
import time 

Proc = None 

def signal_handler(sig, frame): 
    ''' Kill the program ''' 
    os.kill(Proc.pid, sig) 
    sys.exit(0) 

def main(): 
    global Proc 
    ''' Handle signal on parent program ''' 
    signal.signal(signal.SIGTERM, signal_handler) 
    signal.signal(signal.SIGINT, signal_handler) 

    Proc = subprocess.Popen(['python', 'program.py'], 
          stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    while True: 
     try: 
      wait = Proc.wait() 
      if wait: 
       if wait != (-1 * signal.SIGKILL): 
        print "Restarting ....(return code %d)" % wait 
        time.sleep(1) 
        Proc = subprocess.Popen(['python', 'program.py'], 
              stdout=subprocess.PIPE, 
              stderr=subprocess.PIPE) 
       else: 
        ''' kill yourself ''' 
        sys.exit(0) 
     except KeyboardInterrupt: 
      # If python >= 2.6 
      # Proc.kill() 
      sys.exit(0) 

if __name__ == '__main__': 
    main() 
0

如果你可以改變program.py我會修改它,這樣就可以直接調用它,而不是在一個子進程。如果你的程序如下只包含定義和最終的可執行部分的約定來執行,只有當它被直接調用,也就是它看起來像

def do_something(): 
    pass 

def do_something_else(): 
    pass 

if __name__ == '__main__': 
    do_something() 
    do_something_else() 

這是足以包裹在一個函數的最後一個塊,如

def main(): 
    do_something() 
    do_something_else() 

if __name__ == '__main__': 
    main() 

此時你可以導入你的program.py模塊,並呼籲program.main(),使你的代碼更簡單。

相關問題