Durch Python ein Programm öffnen 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
1997Jan
User
Beiträge: 3
Registriert: Sonntag 4. Dezember 2011, 17:47

Hey

Kann man durch Python ein Programm öffnen lassen und den Pfad des Programs angeben?

Wenn ja wie?

Thx+MfG Jan
lunar

Lies die Dokumentation zum "subprocess"-Modul in der Standardbibliothek.
problembär

Code: Alles auswählen

import os
os.system("/path/to/your/program -with -options")
"subprocess" wird hier zwar dauernd empfohlen, aber man braucht es nur, wenn man andere Prozesse über einen längeren Zeitraum steuern will. Wenn man nur mal schnell einen Shell-Befehl ausführen will, braucht man es nicht.
lunar

@Problembär: Dieses „Argument“ kann man ebenso gut umdrehen: Man braucht "os.system()" nicht, um mal eben schnell einen Shell-Befehl auszuführen. "subprocess" ist einfacher und sicherer. Höre doch bitte auf, Hilfesuchende mit unsinnigen Ratschlägen in die Irre zu führen.
problembär

lunar hat geschrieben:@Problembär: Dieses „Argument“ kann man ebenso gut umdrehen: Man braucht "os.system()" nicht, um mal eben schnell einen Shell-Befehl auszuführen. "subprocess" ist einfacher und sicherer. Höre doch bitte auf, Hilfesuchende mit unsinnigen Ratschlägen in die Irre zu führen.
Das mache ich erst dann, wenn "os.system()" und "os.popen()" kein gültiges Python mehr sind, das heißt, wenn sie nicht mehr von Python zur Verfügung gestellt werden.
Ansonsten bestreite ich, daß es unsinnig sei, sie zu empfehlen und daß der Ratschlag in die Irre führe. Stattdessen fordere ich zu mehr Toleranz gegenüber Andersdenkenden auf.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

problembär hat geschrieben:

Code: Alles auswählen

import os
os.system("/path/to/your/program -with -options")
Wenn in der Dokumentation zu subprocess steht "This module intends to replace several other, older modules and functions, such as: os.system[...]", dann würde ich persönlich auch den kanonischen Weg mit subprocess gehen und vor allem würde ich anderen nicht zu den Techniken raten, die abgelöst werden sollen.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

/me hat geschrieben:
problembär hat geschrieben:

Code: Alles auswählen

import os
os.system("/path/to/your/program -with -options")
Wenn in der Dokumentation zu subprocess steht "This module intends to replace several other, older modules and functions, such as: os.system[...]", dann würde ich persönlich auch den kanonischen Weg mit subprocess gehen und vor allem würde ich anderen nicht zu den Techniken raten, die abgelöst werden sollen.
Insbesondere dann, wenn der kanonische und neuere Weg weniger Lernaufwand bedeutet und nicht mehr!
Tom_H
User
Beiträge: 13
Registriert: Sonntag 3. Juli 2011, 10:12

Wenn das Programm eine Konsolenapp ist, kann man auch noch die Ausgaben weiterverwerten:

Code: Alles auswählen

outputstr = subprocess.Popen([<programm>, <options>], stdout=subprocess.PIPE).communicate()[0]
mfg, Tom
lunar

@problembär: Mit Toleranz hat diese Angelegenheit nichts zu tun. Es geht um die rein technische Frage nach der Qualität einer Lösung, die in diesem Fall ziemlich einfach zu beantworten ist, da bereits die Dokumentation der Standardbibliothek klare Worte spricht:
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.
Wenn Du ungeachtet dessen unfähig zur Einsicht bist, dann unterlasse Hinweise auf eine veraltete und überholte Lösung wenigstens aus Höflichkeit und Respekt gegenüber dem Hilfesuchenden, der sicherlich eine gute und sinnvolle Antwort erwartet.

@1997Jan: Zur Vollständigkeit, so sieht die Verwendung des "subprocess"-Moduls aus:

Code: Alles auswählen

import subprocess
subprocess.call(['/Pfad/zum/Program', '-option1', '-option2'])
Der Vorteil an dieser Lösung ist unter anderem, dass Du problemlos Dateinamen mit Leerzeichen verwenden kannst.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@problembär:
Du kannst für Subprozesse auch os.fork() und eine der os.exec....()-Varianten bzw. unter Windows CreateProcess() nutzen. Ist auch gültiges Python. Sollte man es deshalb benutzen? Ohne guten Grund eher nein. Ein guter Grund wäre, dass man einen sehr speziellen Fall der Prozessgenerierung braucht, der von subprocess nicht abgebildet wird. Und subprocess lässt da fast keine Wünsche offen, abstrahiert zusätzlich die Plattformunabhängigkeit und kümmert sich um sowas wie Ein-/Ausgabeumleitung.
Im Falle von os.system() ist es so, dass der User, der häufig gar keine Shellumgebung braucht, an dieser nicht vorbei kommt, und der system-Aufruf zusätzliche Einschränkungen hat, die unbedingt zu beachten sind.

Je weiter low-level man programmiert, umso besser sollte die Kenntnis um diese Einschränkungen/Besonderheiten sein. Um diese Fallstricke kümmert sich subprocess weitestgehend und ist daher für den "Jeden-Tag-Gebrauch" zu empfehlen. Dies gilt definitiv nicht für os.popen, os.system etc.

Ich finde es sehr schade, dass Du Deinen "Ich bin dagegen"-Feldzug wider aller Hinweise in den Dokus und besseren Wissens (unterstelle ich) auf dem Rücken Unbedarfter, die wirklich auf die Hilfe angewiesen sind, hier austrägst.
Antworten