2013-12-17 9 views
13

Ho un codice Python che di tanto in tanto ha bisogno di estendere un nuovo processo per eseguire uno script di shell in un modo "fire and forget", cioè senza bloccare. Lo script della shell non comunicherà con il codice python originale e, di fatto, probabilmente terminerà il processo python chiamante, quindi lo script della shell lanciato non può essere un processo figlio del processo python chiamante. Ho bisogno che venga lanciato come processo indipendente.come generare un nuovo processo indipendente in python

In altre parole, supponiamo di avere mycode.py e che lanci script.sh. Quindi mycode.py continuerà l'elaborazione senza bloccare. Lo script script.sh farà alcune cose in modo indipendente, quindi fermerà e riavvia mycode.py. Quindi il processo che esegue script.py deve essere completamente indipendente da mycode.py. Come posso fare esattamente questo? Penso che subprocess.Popen non bloccherà ma creerà comunque un processo figlio che termina non appena mycode.py si ferma, che non è quello che voglio.

+0

Try [python-daemon] (https://pypi.python.org/pypi/python-daemon/) – JBernardo

risposta

13

provare a preparare "nohup" a script.sh http://en.wikipedia.org/wiki/Nohup. Probabilmente dovrai decidere cosa fare con stdout e stderr, lo faccio semplicemente cadere nell'esempio.

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

Questo sembra funzionare - grazie! – Marc

+0

strano, ho bisogno di un '&' al termine del comando per fare in modo che questo funzioni – boh

+0

Come si passano gli argomenti attraverso questo? – AngryPanda

1

Basta usare subprocess.Popen. Il seguente funziona bene per me su Windows XP & 7 e pythons 2.5.4, 2.6.6 e 2.7.4 e dopo essere stato convertito con py2exe - non provato 3.3 - deriva dalla necessità di eliminare il software di test scaduto sulla macchina client.

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]) 
Problemi correlati