Externes Programm öffnen

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
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

Hallo Forum,

Anwendungsgebiet: Werkstofftechnik und Mechanik
Folgendes als Hintergrund: aus Zugversuchen erhalte ich ein Spannungsdehnungsdiagramm. Über ein mechanisches Model (das ist in Fortran geschrieben und liegt mir als exe-Datei vor) kann das Materialverhalten simuliert werden. In das mechanische Modell gehen 8 physikalische Parameter ein. Um zuverlässige Simulationsergebnisse aus weiteren Simulationen zu erhalten, müssen diese Parameter so angepasst werden, dass die Daten aus der Simulation mit den Daten des realen Versuch möglichst gut übereinstimmen.

Dazu möchte ich die exe-Datei in einem Python-Script aufrufen, ihr einige Parameter übergeben und das Ergebnis nachher mit den Versuchsdaten vergleiche, welche Parameterkombination am besten passt.

Nun meine Frage: wie kann ich diese exe-Datei im Script aufrufen, warten bis sie fertig ist und dann das Script zur weiteren Auswertung weiterlaufen lassen?
Die Parameterübergabe habe ich schon geregelt, ich speichere die verschiedenen Kombinationen in einer txt-Datei die standardmäßig durch die exe-Datei eingelesen wird.

Also: wie rufe ich die exe von Python aus auf und wie erhält Python die Info, dass die exe fertig ist und das py-Script weiterarbeiten kann?

Vielen Dank für eure Hinweise.

Gruß
Jeremy
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo Jeremy,

das Modul subprocess wird dir dabei behilflich sein :)

Kurzes Beispiel:

Code: Alles auswählen

import subprocess
p = subprocess.Popen([r"C:\...\programm.exe", "-h"], stdout=subprocess.PIPE)
p.wait()
print p.stdout.read()
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Vielleicht willst du dein Verfahren auch optimieren und bestimmst mit der "Methode der kleinsten Quadrate" die optimalen Parameter.
http://www.scipy.org/Cookbook/FittingData

Dazu muss dann in dem Beispiel die "fitfunc" mit einer Funktion ersetzt werden, die den Aufruf der exe enthält und das Ergebnis zurückgibt. Oder du definierst dein Modell gleich in Python, das wäre IMHO die sinnvollste Lösung.

Edit: Oder du bindest den Fotran-Code mit Cython ein ;)
http://wiki.cython.org/kwsmith/soc09

Edit2: Das geht ja auch ohne Cython:
http://www.scipy.org/F2py
Damit kannst du Fotran-Code direkt in eine Python-Extension kompilieren. Sieht auf den ersten Blick sehr einfach aus (im Vergleich zum Link oben ;) ).
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

Vielen Dank fuer eure Antworten, da habe ich schon viele Ansatzpunkte.

@ Zap: dieses subprocess Modul werde ich mir ansehen.

@ ice2k3: Ich habe schon ueber eine Moeglichkeit nachgedacht wie ich die Versuchsdaten mit den Simulationsdaten vergleichen und die beste Parameterkombination auswaehlen kann. Die Parameter sollen gewisse Grenzwerte nicht ueber- bzw. unterschreiten, da sie dann physikalisch keinen Sinn mehr haben. Deshalb muesste ich der Optimierung Grenzen fuer die Parameterwahl setzen.

Meine erste Idee ist: Ein Python Script schreiben in dem ich alle Parameterkombinationen definiere und dann alle kombinationen durchrechnen lasse. Das ist natuerlich sehr zeitintensiv. Waere in einen solchen Fall die Konvertierung des Fortran-Codes in Python besser oder bietet der Aufruf der externen exe einen Vorteil?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Jeremy hat geschrieben:Meine erste Idee ist: Ein Python Script schreiben in dem ich alle Parameterkombinationen definiere und dann alle kombinationen durchrechnen lasse. Das ist natuerlich sehr zeitintensiv. Waere in einen solchen Fall die Konvertierung des Fortran-Codes in Python besser oder bietet der Aufruf der externen exe einen Vorteil?
Ich vermute, dass die Kommunikation über Pipes (also Verwendung der exe) langsamer ist, wie ein Python-Kompilat. Vielleicht weiß das aber jemand genauer.
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

Ich habe da noch mal eine Frage: das externe Programm kann ich öffnen, aber es wird nicht ausgeführt. Also das Command-Fenster geht auf und sofort wieder zu, ohne daas das externe Programm die gewünschte Rechnung ausführt.
Woran kann das liegen? Das externe Programm gibt den momentanen Rechenstatus im Command-Fenster aus.
Danke und Gruß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Meine Kristallkugel streikt, die will Code sehn.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Zeig uns doch einfach mal Code, mit deiner Beschreibung komm zumindest ich überhaupt nicht weiter. Normal müsste beim Aufruf über ``subprocess`` die Ausgabe auch in der aktuellen Shell kommen und nicht in einer zweiten, das ist schon mal seltsam.
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

Ich habe das Problem gelöst. Ich arbeite hier mit einem Vista Rechner (und die Firewall hat die Python-Shell daran gehinert, mein Fortran Programm aufzurufen, also musste ich das erst freigeben.
Mein Code zum Aufrufen des externen Programm sind die Zeilen, die Zap weiter oben geschrieben hat. Ich habe nur die stdout = .. entfernt, weil es sonst viel zu langsam ist.
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

Hi ich weiß dieser Beitrag ist schon älter, aber trotzdem.
Ich habe so ein ähnliches Problem wie Jeremy.
Wenn ich das Programm ausführe und auf den Button, 'b1' klicke kommt nichts.
Ich hab Windows 7. Das mit dem Firewall habe ich schonmal versucht, hat aber nichts genutzt.
Hier mein Code:

Code: Alles auswählen

from PythonCard import model
import subprocess

class MainWindow(model.Background):
    def on_b1(self, event):
      p = subprocess.Popen([r"C:\Program Files\Software Institute\SIPing.exe", "-h"], stdout=subprocess.PIPE)
app = model.Application(MainWindow)
app.MainLoop()
Bemerkung: Das Fenster habe ich mit PythonCard gemacht.
'b1' ist der Button.

Was ist falsch :K :?: :?: :?: .
Bitte helft mir.
Im vorraus schonmal Danke.
Zuletzt geändert von campino97 am Sonntag 3. April 2011, 20:11, insgesamt 2-mal geändert.
BlackJack

@campino97: Hast Du überprüft ob die Funktion `on_b1` (übrigens ein schlechter Name) aufgerufen wird, wenn Du die Schaltfläche drückst?

Was hättest Du denn erwartet was bei dem Druck passiert? Gibt das Programm etwas auf seiner Standardausgabe aus? Dann musst Du das auch auslesen wenn Du sie umleitest, sonst blockiert es, weil es seine Daten nicht los wird.
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

@BlackJack: Ja habe ich schon es passiert nichts. Wenn ich 'b1' drücke, passiert nichts.

es heißt im resource Editor und in IDLE 'b1', also daran liegt es nicht.
ich habe das gerade mit easygui versucht, da hat es Funktioniert.
Mein Code bei Easygui:

Code: Alles auswählen

import easygui
import subprocess

x = easygui.buttonbox('Was möchtest du tun?',
                      choices = ['ISPing','Beenden'])
if x == 'ISPing':
     print "Hi"
     p = subprocess.Popen([r"C:\Program Files\Software Institute\SIPing.exe", "-h"], stdout=subprocess.PIPE)

Also vermute ich, dass es an PythonCard liegt.
Was ist falsch? Bitte helft mir.
Im vorraus schonmal Danke.

PS: Kann mir jemand bei diesen Problemen http://www.python-forum.de/viewtopic.ph ... 57#p195357 helfen?
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

hallo nochmal ich habe das Problem.
ich habe das "_mouseClick" bei der "def on" vergessen.
Danke nochmal
Antworten