我要尋找一個Python相當於以下內容:Python程序來管理python腳本作爲孩子
until python program.py; do
echo "Crashed...Restarting..." >&2
sleep 1
done
另外,我需要在父程序殺害,當殺program.py。有什麼建議麼?
我要尋找一個Python相當於以下內容:Python程序來管理python腳本作爲孩子
until python program.py; do
echo "Crashed...Restarting..." >&2
sleep 1
done
另外,我需要在父程序殺害,當殺program.py。有什麼建議麼?
模塊subprocess
和psutil
應提供您需要的大部分(如果不是全部)。
import sys, subprocess
while True :
retCode= subprocess.call(["python","program.py"])
if retCode == 0 : break
print('Crashed...Restarting...', file=sys.stderr)
謝謝。子過程的確會成爲一招。我會用代碼寫一個詳細的答案 –
#!/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()
如果你可以改變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()
,使你的代碼更簡單。
你能修改program.py嗎? –
嗨尼古拉,你到底想修改program.py?看看下面的答案(來自我)是否有意義。謝謝。 –