Führen Sie das Python-Skript nach dem anderen aus

Ich habe ein Python-Skript, das mehrere Stunden dauert. Ich laufe es gewöhnlich als:

python myscript.py arg1 arg2 ... argN 2> log.err > log.out & 

Ich hätte gern ein Shell-Skript, das mehrere Male das gleiche Python-Skript läuft (mit verschiedenen Parametern). Dieses Skript muss das zweite Python-Skript nur starten, wenn das erste gekündigt hat und so weiter. Ich denke, ich sollte PID von den Prozessen verwenden und iterativ überprüfen mit Schlaf innerhalb einige während Schleifen. Irgendwelche Vorschläge? Die Skripte werden in einer entfernten Maschine ausgeführt, also muss ich sie in den Hintergrund stellen, um die Garantie, die sie halten, auch wenn ich mich abmelden.

4 Solutions collect form web for “Führen Sie das Python-Skript nach dem anderen aus”

Anstatt jeden Aufruf von Python zu hinterlassen, verwenden Sie ein Skript, das alle Aufträge eins nach dem anderen ausführt und das Skript hinterlegt. Beispielsweise:

 #!/bin/sh python myscript.py arg1 arg2 ... argN 2> log.err > log.out python myscript.py different_args # etc. 

Machen Sie das Skript ausführbar ( chmod +x script.sh ) und führen Sie es aus der Shell wie ./script.sh &


Vielleicht solltest du einen Blick auf ein Werkzeug wie screen werfen, das deine Jobs nach dem Abmelden halten wird. Wenn Sie den screen ./script.sh , dann ablösen ( ctrl-ad ) und abmelden, wird Ihr Skript weiterhin ausgeführt. Dann kannst du dich später wieder anmelden und mit dem screen -r wieder screen -r .

Machen Sie ein Bash-Skript?

 python first.py python second.py 

Wenn Sie möchten, dass ein Skript direkt nach dem anderen läuft, lassen Sie einfach das Trailing & . Das kaufmännische und erzählt bash, um den Prozess im Hintergrund laufen zu lassen, der Ihnen erlaubt, mehrere Prozesse parallel zu laufen (einige im Hintergrund und einige im Vordergrund). Wenn du sie nacheinander ausführen willst, solltest du sie jeweils im Vordergrund laufen lassen, so wie:

 python myscript.py argX1 argX2 ... argXN 2> logX.err > logX.out python myscript.py argY1 argY2 ... argYN 2> logY.err > logY.out 

Dies wird das Skript mit den Argx-Argumenten ausführen, dann, nach dem beendet, führen Sie das gleiche Skript erneut mit den ArgY-Argumenten.

Wenn du die nächste Ausführung nur dann ausführen möchtest, wenn der erste Lauf erfolgreich ist , kannst du das doppelte Und-Zeichen ( && ) so verwenden (man beachte, dass der nachlaufende Backslash ( \ ) dem Newline entgeht, also ist das Ganze eigentlich ein einziger Befehl) :

 python myscript.py argx1 argx2 ... argN 2> logx.err > logx.out && \ python myscript.py argy1 argy2 ... argN 2> logy.err > logy.out 

Sie können mehr als zwei Befehle mit doppelten Aufträgen verknüpfen, aber für längere Skripte sollten Sie die Verwendung von set -e am Anfang verwenden, was dazu führt, dass bash das Ausführen des Skripts nach dem ersten Fehler beendet (siehe http: //www.davidpashley). Com / articles / writing-robust-shell-scripts / # id2382181 )

Zum Beispiel können Sie den Zyklus (machen Sie ein Skript runner.sh mit dem nächsten Inhalt:

 n=0 while read -r line do let n++ echo python myscript.py $line #>log.$n.log 2>log.$n.err done <<ARGS a1 a2 a3 a4 b1 b2 c1 c2 c3 c4 ARGS 

Dies wird dry run Ihre Python-Skript mit Args

 a1 a2 a3 a4 b1 b2 c1 c2 c3 c4 

Sequentiell, zB wenn das vorherige endet.

Wenn Sie zufrieden sind, entfernen Sie das echo und das # aus der Zeile

  echo python myscript.py $line #>log.$n.log 2>log.$n.err 

Die Protokolldateien werden nacheinander nummeriert … 1..n .

Warum willst du das python Skript im Hintergrund laufen? Sie können immer auf den Hintergrund des oben genannten Skripts zu senden und die ganze Sequenz wird in der bg .

Wenn Sie es nach dem Abmelden ausführen müssen, verwenden Sie den oben genannten runner.sh als

 chmod 755 runner.sh nohup runner.sh logout 

Oder viel besser nutzen Sie das screen Dienstprogramm, und Sie können abmelden und melden Sie sich von einem anderen Ort und re-attach die Sitzung und so weiter … lesen man screen .

Python ist die beste Programmiersprache der Welt.