Seite 1 von 1

Subprozess - Wait

Verfasst: Montag 14. September 2009, 13:00
von Benz
Hallo!
Leider habe ich noch keine großen Erfahrungen im Python programmieren!
Dadurch habe ich auch folgendes Problem:
Ich starte in einem Pyhton-basierendem Programm ein einen Solver-Run (in einem externen Programm) und diesen würde ich ganz gerne abwarten, bis der nächste Schritt bearbeitet wird.
Hat jemand eine Ahnung wie ich das anstelle?

popen.wait()
popen.communicate()
??
??

Danke, viele Grüße
Benz

Verfasst: Montag 14. September 2009, 13:17
von Rebecca
[mod]subprocess[/mod] ist dein Freund.

Wenn du den output nicht brauchst, call, ansonsten dieses Snippet.

Verfasst: Montag 14. September 2009, 13:32
von Benz
Hallo!
Danke!
aber bei mir fehlts da bezüglich phyten-programmierung weiter...sorry
wenn ich das propiere kommt folgendes:
Traceback (most recent call last):
File "<input>",line1, in<module>
File "subprocess.py", line 595, in __init__
File "subprocess.py",line 804, in _execute_child
WindowsError: [Error 2] The system cannot find the file specified

Kann mit hier jemand ein kurzes Bsp zeigen???

Danke!

Verfasst: Montag 14. September 2009, 13:36
von Hyperion
Rebecca hat Dir doch Beispiele verlinkt!

Die Fehlermeldung deutet darauf hin, dass Du einfach ein Programm aufrufst, dass nicht ausgeführt werden kann:

Code: Alles auswählen

In [82]: import subprocess

In [83]: subprocess.Popen("mich_gibts_nicht.exe")
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)

/home/nelson/src/Python/old/karten/<ipython console> in <module>()

/usr/lib/python2.6/subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
    593                             p2cread, p2cwrite,
    594                             c2pread, c2pwrite,
--> 595                             errread, errwrite)
    596
    597         if mswindows:

/usr/lib/python2.6/subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
   1090                     if fd is not None:
   1091                         os.close(fd)
-> 1092                 raise child_exception
   1093
   1094

OSError: [Errno 2] No such file or directory
(Hier eben auf einer Linux-Plattform)

Das Programm muss also entweder im Suchpfad des OS stehen, oder Du musst den Pfad zum Programm spezifizieren.

Verfasst: Montag 14. September 2009, 13:59
von Benz
Hallo!
Danke für die Antwort!
Aber Sorry, ich stehe da einfach an..
ich möchte einen Nastran.Solver aufruf über Pyhton starten!
das funktioniert auch, indem ich einfach:

Model1_car['allsel'].solve()

eingebe!
Dann läuft der Solver-Prozess los...

jetzt will ich einfach, das das Programm wartet bis dieser Aufruf fertig ist!

Wenn ich da schreibe: subprocess.Popen("Modell1_car['allsel'].solve()")
funktioniert dies nicht....

Entschuldige bitte die dumme frage..aber...

Verfasst: Montag 14. September 2009, 14:03
von Rebecca
Model1_car['allsel'].solve()
Das haettest du ja schonmal eher sagen koennen... :roll:
Du willst also nicht direkt einen externen Prozess starten, sondern benutzt eine Library dafuer. Dann hat diese Library entweder die Funktion die du brauchst, oder eben nicht. Wenn du uns verraetst, was fuer eine Library du benutzt, kann die vlt. jemand die Antwort sagen.

Verfasst: Montag 14. September 2009, 14:06
von Hyperion
Benz hat geschrieben: Model1_car['allsel'].solve()
Das sieht mir nach einem Python-Konstrukt aus - nicht nach einem Programmstart! Sehe ich das richtig?

Ich glaube Du hast nicht verstanden, was subprocess ermöglicht. Damit kann man externe Programm starten.
jetzt will ich einfach, das das Programm wartet bis dieser Aufruf fertig ist!
Was passiert denn wenn Du das obige in einem Python-Script aufrufst? Woran erkennst Du, ob solve() noch arbeitet, während Dein Script weiterläuft?

Verfasst: Montag 14. September 2009, 14:09
von Benz
Keine Ahnung welche Library da vewendet wird...
ich definiere da nur ein paar Parameter des models und dann schick ich es los zum rechnen...
welche soll ich da einpflegen???

Verfasst: Montag 14. September 2009, 14:17
von Hyperion
Sorry, aber so kommen wir nicht weiter!

Du musst uns erst einmal möglichst detailliert erklären, was Du willst, wie Du es bisher umgesetzt hast und vor allem welche Rahmenbedingungen bei Dir herrschen!

Woher stammt "Model1_car"? Um welches Themengebiet handelt es sich? Woher weißt Du, dass es eine .solve() Methode gibt?

Verfasst: Montag 14. September 2009, 14:28
von Benz
Ok...
ich bin da ein ziemlich primitiver Anwender der einfach ein Unterprogramm in Nastran laufen hat. dieses Unterprogramm kann einige Parameter definieren und ändern und dann eben diesen Solver-run starten.
Das es diesen .solver() Befehl gibt, weiß ich daher, da dieses Unterprogramm ein Befehlsskript ausgibt, von welchem ich einfach diesen Befehl rauskopiert habe!
die anderen Befehle sind für mich klar verständlich, definition der Koordinatensysteme, Eigenschaften von Mateialien...
jedoch ist dort nichts von irgendwelchen import... zeugs was zu sehen. (ausser, dass das model importiert wird..)
so und nun stehe ich da..und habe keine Ahnung!
bisher habe ich das mit dem time.sleep(Wartezeit) Befehl gelöst - funktioniert, ist aber nicht im Sinne des Erfinders....
ich weiß nur, dass Python 2.6.2 verwendet wird..

Verfasst: Montag 14. September 2009, 14:34
von Hyperion
Ok, zu erst einmal: Hier weiß sicherlich kaum jemand, was Nastran eigentlich ist! Es wäre daher eine gute Idee, zunächst einmal zu erklären, was Nastran ist und kurz, was Du darin machen möchtest.

http://de.wikipedia.org/wiki/Nastran

Liege ich damit richtig?
ich bin da ein ziemlich primitiver Anwender der einfach ein Unterprogramm in Nastran laufen hat
Ok, was genau bedeutet das? Wie wird denn da ein Script aufgerufen? Passiert das innerhalb des Programms? (z.B. über ein Menü?) Was heißt "Unterprogramm"?

Wie kannst Du denn festellen, dass .solver() nicht fertig ist?

Bist Du Dir sicher, dass es keine Doku dazu gibt?

Verfasst: Montag 14. September 2009, 14:46
von Benz
Hallo!
Ja mit Nastran liegst du richtig...ein FE-Solver!
für diesen Solver habe ich nun ein Python-Skript basierendes Unterprogramm. Dieses kann ich einfach über einen DOS-Befehl ausführen.
Dann läuft dieses Python -Skript ab (ich kann dieses in einem normalen "Text"-Editor verändern) Sprich die Definitionen variieren!
Am Ende dieses Skripts steht der .solve() aufruf (habe ich selbst eingefügt) und funktioniert auch...Erkennbar daran, das der NAstran-Solver im Batch-Run aufblobbt..und durchrechnet..dann geht er zu und das Ergebnis ist da!
mein Problem dabei ist dann, dass das Unterprogramm ohne abzuwarten wie das Ergebnis ist, einfach weiterläuft und quasi alles zurück an Nastran gibt! Das möchte ich nicht!
ich möchte das er wartet, bis dieser .solver() - Aufruf fertig ist (Wie gesagt bisher mit sleep gelöst, dafür muss ich aber immer wissen wie lange der Solver-Run läuft! )

Verfasst: Montag 14. September 2009, 15:54
von Hyperion
Ok. Das kann man ohne Dokumentation nicht lösen. Vermutlich initiiert solve() einen Thread, der parallel zum Unterprogramm abläuft. Es kann ja bei einer langen Berechnung erwünscht sein, dass der Rest weiterläuft. Evtl. kann man das Verhalten per Parameter steuern. Aber dazu bedarf es der Doku von der Python API dieses Nastran-Tools!