2013-12-17 14 views
13

Ich habe einen Python-Code, der gelegentlich einen neuen Prozess umfassen muss, um ein Shell-Skript in einer "Feuer und vergessen" -Methode, dh ohne zu blockieren. Das Shell-Skript kommuniziert nicht mit dem ursprünglichen Python-Code und beendet wahrscheinlich den aufrufenden Python-Prozess, sodass das gestartete Shell-Skript kein untergeordneter Prozess des aufrufenden Python-Prozesses sein kann. Ich muss es als unabhängigen Prozess starten.Wie spawn neuer unabhängiger Prozess in Python

Mit anderen Worten, sagen wir, ich habe mycode.py und das startet script.sh. Dann wird mycode.py die Verarbeitung ohne Blockierung fortsetzen. Das Skript script.sh wird einige Dinge selbstständig erledigen und dann mycode.py stoppen und neu starten. Der Prozess, der script.py ausführt, muss also vollständig unabhängig von mycode.py sein. Wie genau kann ich das machen? Ich denke subprocess.Popen wird nicht blockieren, aber wird immer noch einen untergeordneten Prozess erstellen, der beendet wird, sobald mycode.py aufhört, was nicht das ist, was ich möchte.

+0

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

Antwort

13

versuchen Sie vor "nohup" zu script.sh http://en.wikipedia.org/wiki/Nohup. Sie werden wahrscheinlich entscheiden müssen, was mit stdout und stderr zu tun ist, ich gebe es einfach in das Beispiel.

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

Dies scheint zu funktionieren - danke! – Marc

+0

komisch, ich brauche ein '&' am Ende des Befehls, damit dies funktioniert – boh

+0

Wie übergibt man Argumente? – AngryPanda

1

Verwenden Sie einfach subprocess.Popen. Das folgende funktioniert OK für mich auf Windows XP & 7 und Pythons 2.5.4, 2.6.6 und 2.7.4 und nach der Konvertierung mit py2exe - nicht versucht 3.3 - es kommt aus der Notwendigkeit, abgelaufene Test-Software auf dem Client-Rechner zu löschen.

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