2013-12-17 54 views
13

我有一些python代碼,偶爾需要跨越一個新的進程來運行一個shell腳本,以「fire and forget」的方式運行,即沒有阻塞。 shell腳本不會與原始python代碼進行通信,實際上可能會終止調用python進程,因此啓動的shell腳本不能成爲調用python進程的子進程。我需要它作爲一個獨立的過程啓動。如何在python中產生新的獨立進程

換句話說,假設我有mycode.py並啓動了script.sh。然後mycode.py將繼續處理而不會阻塞。腳本script.sh將獨立完成一些事情,然後會實際停止並重新啓動mycode.py。所以運行script.py的進程必須完全獨立於mycode.py。我該如何做到這一點?我認爲subprocess.Popen不會阻塞,但仍然會創建一個子進程,一旦mycode.py停止就終止,這不是我想要的。

+0

嘗試[蟒蛇守護進程(https://pypi.python.org/pypi/python-daemon/) – JBernardo

回答

13

嘗試對script.sh http://en.wikipedia.org/wiki/Nohup預加「nohup」。您可能需要決定如何處理標準輸出和標準錯誤,我只是將其放在示例中。

import os 
from subprocess import Popen 

devnull = open(os.devnull, 'wb') # use this in python < 3.3 
# python >= 3.3 has subprocess.DEVNULL 
Popen(['nohup', 'script.sh'], stdout=devnull, stderr=devnull) 
+0

這似乎是工作 - 謝謝! – Marc

+0

奇怪,我需要一個'&'在命令結束才能工作 – boh

+0

你如何通過這個參數傳遞? – AngryPanda

1

只要使用subprocess.Popen。以下工作適用於我在Windows XP & 7和蟒蛇2.5.4,2.6.6和2.7.4和被py2exe轉換後 - 未嘗試3.3 - 它來自需要刪除過期的客戶端機器上的測試軟件

import os 
import subprocess 
import sys 
from tempfile import gettempdir 

def ExitAndDestroy(ProgPath): 
    """ Exit and destroy """ 
    absp = os.path.abspath(ProgPath) 
    fn = os.path.join(gettempdir(), 'SelfDestruct.bat') 
    script_lines = [ 
     '@rem Self Destruct Script', 
     '@echo ERROR - Attempting to run expired test only software', 
     '@pause', 
     '@del /F /Q %s' % (absp), 
     '@echo Deleted Offending File!', 
     '@del /F /Q %s\n' % (fn), 
     #'@exit\n', 
     ] 
    bf = open(fn, 'wt') 
    bf.write('\n'.join(script_lines)) 
    bf.flush() 
    bf.close() 
    p = subprocess.Popen([fn], shell=False) 
    sys.exit(-1) 

if __name__ == "__main__": 
    ExitAndDestroy(sys.argv[0]) 
相關問題