2016-04-19 23 views
0

Ich arbeite unter anderem mit Gaussian, einem Programm zur Optimierung der molekularen Geometrie. Gauß kann Tage dauern, um eine einzelne Optimierung zu beenden, also habe ich beschlossen, ein Programm auf Python zu machen, um mir eine E-Mail zu senden, wenn es fertig ist. Die E-Mail-Sendung habe ich herausgefunden. Das Problem besteht darin, dass Gaussian automatisch eine Protokolldatei und eine CHK-Datei generiert, die die tatsächlichen Ergebnisse des Prozesses enthält, und unter Verwendung von subprocess.call(['command'], shell=False) werden beide Dateien nicht generiert.Wie bekomme ich die Protokolldatei, die ein Programm erstellt, wenn es mit subprocess.call() ausgeführt wird?

Ich habe auch versucht, das Problem mit os.system(command) zu lösen, die mir die .log-Datei und die .chk-Datei gibt, aber die E-Mail wird gesendet, ohne auf den Abschluss der Optimierung warten.

Eine weitere wichtige Sache, ich habe den gesamten Prozess im Hintergrund laufen zu lassen, weil, wie ich am Anfang sagte, es Tage dauern könnte vorbei zu sein, und ich kann das Terminal öffnen, dass lange nicht verlassen.

+0

das Terminal geöffnet verlassen kann mit 'screen' erreicht werden. Sie müssen die generierten Dateien von der Festplatte lesen und sie in Ihre Berichts-E-Mail einfügen. Die Generierung von Protokolldateien ist unabhängig von der aufrufenden Methode. – Paebbels

+0

Nun, ich habe es geschafft, das Problem zu lösen, ich habe nach der Antwort gesucht und mein Fehler war ziemlich offensichtlich. Um Gaussian auf dem Terminal zu verwenden, benutze ich '$ g09 input.com &', also läuft es in bg. Das war der Befehl, den ich in 'subprocess.call (['command'] 'und' os.system (command) '') benutzt habe. Das Problem war das '&', irgendwie' os.system() 'doesn ' t warten, bis der Prozess damit zu beenden. Durch den Verzicht auf '&', es hat geklappt. (Immer noch nicht 'subprocess.call verwenden kann()') –

Antwort

0

mit subprocess.call(['command'], shell=False) beide Dateien werden nicht generiert.

Your comment schlägt vor, dass Sie versuchen, subprocess.call(['g09 input.com &'], shell=False) auszuführen, das falsch ist.

Der Code sollte FileNotFoundError erhöhen. Wenn du es nicht siehst; es bedeutet stderr ist versteckt. Sie sollten es beheben (stellen Sie sicher, dass Sie die Ausgabe von sys.stderr.write('stderr\n') sehen können). Standardmäßig ist stderr nicht ausgeblendet, d. H. Die Art und Weise, wie Sie das übergeordnete Skript starten, ist fehlerhaft. Um der Lage sein, aus der Sitzung zu trennen, versuchen:

$ nohup python /path/to/your_script.py &>your_script.log & 

oder verwenden screen, tmux.

shell=False (btw, es ist default-keine Notwendigkeit, es explizit zu passieren) sollte stark andeuten, dass call() Funktion nicht einen Shell-Befehl nicht erwartet. Und in der Tat, nimmt subprocess.call() eine ausführbare Datei und seine Parameter als Liste statt-es nicht die Shell läuft:

subprocess.check_call(['g09', 'input.com', 'arg 2', 'etc']) 

Hinweis: check_call() wirft eine Ausnahme, wenn g09 kehrt mit einem Nicht-Null-Exit-Code (es einen Fehler anzeigt gewöhnlich).

+0

Sorry, ich wollte nicht, dass vorschlagen, ich wurde mit 'command.split()', um den Befehl als eine Liste zu geben. –

+0

@DanielWatanabe die Spaltung allein wird hier nicht helfen. 'g09' weiß nichts über' & '(es gibt keine Schale zu interpretieren' & '). Sie sollen ein Fehler auf 'g09' beginnen gesehen. – jfs

+0

ich verstehe, dass jetzt, was ich nicht bekommen, ist, dass er den Befehl ausgeführt hat. Um zu testen, ob es zu der Zeit lief ich eine Eingabe gemacht, dass eine geben würde, spezifische Fehlermeldung nach ein paar Minuten, und ich erhielt diese Nachricht, die für mich genug war zu sagen, es läuft, aber gibt mir die Protokolldatei nicht erwartet –