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
Externes Programm öffnen
Hallo Jeremy,
das Modul subprocess wird dir dabei behilflich sein
Kurzes Beispiel:
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()
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 ).
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 ).
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?
@ 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?
Ich vermute, dass die Kommunikation über Pipes (also Verwendung der exe) langsamer ist, wie ein Python-Kompilat. Vielleicht weiß das aber jemand genauer.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 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ß
Woran kann das liegen? Das externe Programm gibt den momentanen Rechenstatus im Command-Fenster aus.
Danke und Gruß
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Meine Kristallkugel streikt, die will Code sehn.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.
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.
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.
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:
Bemerkung: Das Fenster habe ich mit PythonCard gemacht.
'b1' ist der Button.
Was ist falsch :K .
Bitte helft mir.
Im vorraus schonmal Danke.
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()
'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.
@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.
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.
@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:
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?
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)
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?