Seite 1 von 1
nohup über subprocess
Verfasst: Donnerstag 1. August 2013, 10:54
von nonstopaggropop
Hallo zusammen,
bin neu in der Python Programmierung und habe eine Frage zu einem Python-Script.
Ich möchte ein Script programmieren, dass eine große Simulation in mehrere kleine Stücke zerteilt und an den Rechner schickt.
Dafür muss ich am Ende mehrere Commandozeilen ausführen.
Ich mache das momentan mit
Code: Alles auswählen
command = "nohup ./KOH 1000 16 25 16 1 10000 5 &>ScriptTest.dat &"
process = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE)
Die erste Zeile ist der Aufruf, das c-Programm KOH zu starten und übergebe ihm noch Parameter. Das funktioniert auch, und er startet das Programm, allerdings funktioniert die Ausgabe in die ScriptTest.dat nicht. Er legt es an, aber das File ist leer. Kann mir jemand da weiterhelfen?
Hat sich erledigt! Ich gebe einfach
Code: Alles auswählen
process = subprocess.Popen( command, shell=True, stdout=open("script_test.dat","w"))
dahinter zu. Schon klappt es!
Danke!
NonStopAggroPop
Re: nohup über subprocess
Verfasst: Donnerstag 1. August 2013, 11:12
von BlackJack
@nonstopaggropop: Kann es sein das ``&>`` schlicht nicht funktioniert weil die Shell das nicht versteht? Das kennt zum Beispiel die Bash, aber es ist kein Posix, also geht das unter Debian-Derivaten so nicht mit `system()` weil da nicht die Bash sondern ``sh`` gestartet wird, was ein Link auf die ``dash`` ist.
Edit: Dann kann man sich jetzt auch Fragen warum man die unnötige Shell dazwischen schieben muss.
Re: nohup über subprocess
Verfasst: Donnerstag 1. August 2013, 12:46
von cofi
Deine "Loesung" ist nicht aequivalent zu dem was du davor gezeigt hast ... und schon gar nicht solltest du Dateien einfach so oeffnen ohne sie irgendwann zu schliessen. Und so wie du sie oeffnest kannst du sie nie schliessen.
Dann solltest du wenn moeglich auf die Shell verzichten.
Wenn man das beachtet kommt das hier raus:
Code: Alles auswählen
with open('ScriptTest.dat', 'w') as f:
process = subprocess.Popen('nohup ./KOH 1000 16 25 16 1 10000 5'.split(), stdout=f, stderr=f)
Re: nohup über subprocess
Verfasst: Donnerstag 1. August 2013, 13:24
von BlackJack
Wobei das ``nohup`` hier keinen Sinn (mehr) macht. Denn wenn das Python-Programm nicht selber mit ``nohup`` (oder ähnlichem) gestartet wurde, werden die im Programm geöffneten Dateien geschlossen wenn ein HUP-Signal kommt. Und damit wird mit ziemlicher Sicherheit auch das ``KOH``-Programm beendet, weil dem die Standardausgaben abhanden kommen. Falls aber das Python-Programm selber schon mit ``nohup`` gestartet wurde, dann braucht man das nicht mehr für Kindprozesse machen.
In der Regel würde ich so etwas wie ``nohup`` nicht in Programme einbauen, denn der Benutzer könnte das genau so gut beim Elternprogramm selbst erledigen. Oder er benutzt etwas anderes, wie ``screen``, ``tmux``, oder das auf einem der beiden aufbauenden ``byobu``.
Re: nohup über subprocess
Verfasst: Donnerstag 1. August 2013, 13:51
von Sirius3
@BlackJack: warum sollte KOH die Standardausgabe abhanden kommen? Die ist ja auf das Filehandle f umgebogen, und dieses Filehandle wird ja im Kindprozess kopiert. Das HUP-Signal killt dann aber nur die Eltern und nicht den Kindprozess bei nohup.