2016-08-08 29 views
0

Ich bin mit dem subprocess Modul zwei Befehle auszuführen:Run subprocess mit mehreren Befehlen und lösen in den Hintergrund zu halten, um

import shlex  
from subprocess import check_call() 

def comm_1(error_file): 
    comm = shlex("mkdir /tmp/kde") 
    try: 
     check_call(comm) 
    except subprocess.CalledProcessError: 
     error_file.write("Error comm_1") 

def comm_2(error_file): 
    comm = shlex("ls -la /tmp/kde") 
    try: 
     check_call(comm) 
    except subprocess.CalledProcessError: 
     error_file.write("Error comm_2") 

if __name__ == "__main__": 
    with open("error_file", "r+") as log_error_file: 
     comm_1(log_error_file) 
     comm_2(log_error_file) 
     log_error_file.write("Success") 

Ich bin mir dessen bewusst ein paar Fallen in diesem Entwurf, wie die error_file geteilt wird mit den Funktionen. Dies wird jedoch leicht umstrukturiert. Was ich versuche, ist, den gesamten Prozess in den Hintergrund zu bringen. Ich würde dies erreichen mit

check_call(comm, creationflags=subprocess.CREATE_NEW_CONSOLE) 

Aber das wäre ein Rennen Problem darstellen, weil ich sicherstellen möchten, dass comm_1 vor comm_2 beginnt beendet ist. Was ist der beste Ansatz, um dies mit subprocess zu tun? Ich kann python-daemon oder andere Pakete außerhalb der Standardbibliothek von Python 2.6 nicht verwenden.

EDIT: Ich könnte versuchen, etwas zu verwenden, wie

nohup python myscript.py & 

Aber die ideia ist nur ein Weg, um den Job aus dem Python-Skript zu starten.

+0

Scheint so, als könntest du Dinge so ändern, dass 'if __name__ ==" __main __ "' myscript.py etwas hervorbrachte, das am Ende tut, was du gerade tust. Mit den richtigen Bedingungen könnte das wahrscheinlich sein. – martineau

+0

Sorry, aber ich folge nicht. Soll ich die Funktionen entfernen? – Ivan

Antwort

0

Sie können sicherstellen, dass der Prozess innerhalb von comm_1 stirbt, bevor Sie den Subprozessaufruf innerhalb von comm_2 starten, indem Sie wait() verwenden. Aber um dies zu tun, müssen Sie Popen() anstelle von check_call() verwenden.

from subprocess import Popen 

def comm_1(error_file): 
    comm = shlex("mkdir /tmp/kde") 
    try: 
     proc_1 = Popen(comm) 
     proc_1.wait(timeout=20) 
    except subprocess.CalledProcessError, TimeoutExpired: 
     error_file.write("Error comm_1") 

proc_1.wait() wird für 20 Sekunden warten (Sie die Zeit ändern können) für den Prozess, bevor Sie fortfahren zu beenden. Wenn es länger als 20 Sekunden dauert, wird es eine TimeoutExpired Ausnahme werfen, die Sie in Ihrem except Block fangen können.

+0

Danke. Würde der Vaterprozess bei der Popen 'wait'-Methode gelöst werden? Die Sequenz sollte so etwas wie 'python-Prozess starten '->' trennen beide Funktionen' -> 'comm_1 führt' ->' comm_2 führt' aus, ohne dass der vater-Prozess noch vorhanden ist. – Ivan

+0

@Ivan Nur zur Klarstellung, meinst du, wenn das Python-Skript vollständig ausgeführt und beendet würde, während "comm_1" und "comm_2" weiterhin im Hintergrund ausgeführt werden, bis sie auch fertig sind? – TheGirrafish

+0

Genau. Das Python-Skript ist ein "Launcher" und sollte beendet werden, während "comm_1" und "comm_2" im Hintergrund laufen. – Ivan