Subprozess - Wait

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benz
User
Beiträge: 6
Registriert: Montag 14. September 2009, 12:54

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

[mod]subprocess[/mod] ist dein Freund.

Wenn du den output nicht brauchst, call, ansonsten dieses Snippet.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benz
User
Beiträge: 6
Registriert: Montag 14. September 2009, 12:54

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Benz
User
Beiträge: 6
Registriert: Montag 14. September 2009, 12:54

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...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
Benz
User
Beiträge: 6
Registriert: Montag 14. September 2009, 12:54

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???
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
Benz
User
Beiträge: 6
Registriert: Montag 14. September 2009, 12:54

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..
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
Benz
User
Beiträge: 6
Registriert: Montag 14. September 2009, 12:54

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! )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
Antworten