Non-Python-Programm in Python ausführen lassen

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
kleiner.epsilon
User
Beiträge: 25
Registriert: Sonntag 31. Oktober 2010, 14:31

Hallo,

ich möchte in Python ein Programm aufrufen und ausführen lassen.
Habe es mit execfile probiert, aber es funktioniert nicht.

Genauer: das Programm1 selbst erzeugt Zufallszahlen und speichert sie in einer Datei1.
Programm2 liest die Daten aus der Datei1 ein, verwendet sie und gibt andere Zahlen in einer Datei2 wieder aus.
Ich möchte diesen Vorgang in einer Schleife mehrmals ausführen lassen.
Aber es happert schon an dem Aufruf des Programms (das ist selbst in Fortran geschrieben).

Hat mir jemand Tipps, was ich noch ausprobieren kann?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das subprocess-Modul

`execfile` ist fuer Python-Module gedacht - und ist ausserdem nicht mehr in Python3 dabei.
kleiner.epsilon
User
Beiträge: 25
Registriert: Sonntag 31. Oktober 2010, 14:31

Ich habe selber eine Lösung gefunden: :)

import os
result = os.system('programmname /pfad')

Damit hat sich mein Problem erledigt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

kleiner.epsilon hat geschrieben:Ich habe selber eine Lösung gefunden: :)

import os
result = os.system('programmname /pfad')
Die ist aber nicht gut; Gründe stehen in der Doku zu os.system()!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kleiner.epsilon
User
Beiträge: 25
Registriert: Sonntag 31. Oktober 2010, 14:31

@Hyperion:
ich habe mir die Doku zu os.system jetzt mehrmals durchgelesen, und auch verstanden, dass es Einschränkungen, Probleme oder sowas geben kann, aber die Bedeutung dessen, oder was das genau heißt, habe ich nicht verstanden. :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, um es mal flapsig zu sagen: Musst Du ja auch nicht verstehen, da es andere mit Sicherheit durchdacht haben ;-)

Für derartige Dinge ist das subprocess-Modul eben besser geeignet, weil es für alle möglichen Arten von Kommunikation mit dem aufgerufenem Programm ausgelegt ist. Es bietet Dir daher eine einheitliche API und ist universell einsetzbar.

Insofern ist es einfach sinnvoll direkt darauf zu setzen, gleichwohl die Anfangshürde ggf. ein wenig größer ist (Wobei man sich eigentlich auch nur mal die Doku gut angucken muss, um die grundlegenden Dinge zu begreifen; für das Ersetzen von os.system() gibt es ja sogar explizite Beispiele!).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3858
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

oder so: http://sourceforge.net/projects/pyfortran/

Das Projekt ist zwar nicht mehr ganz frisch, aber die Versionsnummer lässt Stabilität vermuten. ;-)

Gruß, noisefloor
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hyperion hat geschrieben:Für derartige Dinge ist das subprocess-Modul eben besser geeignet, weil es für alle möglichen Arten von Kommunikation mit dem aufgerufenem Programm ausgelegt ist. Es bietet Dir daher eine einheitliche API und ist universell einsetzbar.
Mit anderen Worten: 'subprocess' ist mächtiger als 'os.system' und kann mehr. Solange dich das aber nicht stört, gibt es keinen Grund 'os.system' nicht zu verwenden. Das es 'subprocess' gibt, sollte man trotzdem im Hinterkopf behalten.
noisefloor hat geschrieben:oder so: http://sourceforge.net/projects/pyfortran/
Da bietet sich auch F2PY an, das mit NumPy kommt.

Grüße
Gerrit
Antworten