Ich muss in der Lage sein, ein Dokument mit seiner Standardanwendung unter Windows und Mac OS zu öffnen. Grundsätzlich möchte ich dasselbe tun, was passiert, wenn Sie im Explorer oder Finder auf das Dokumentsymbol doppelklicken. Was ist der beste Weg, dies in Python zu tun?
125
Antworten:
open
undstart
sind Befehlsinterpreter für Mac OS / X bzw. Windows, um dies zu tun.Um sie von Python aus aufzurufen, können Sie entweder das
subprocess
Modul oder verwendenos.system()
.Hier sind Überlegungen, welches Paket verwendet werden soll:
Sie können sie über anrufen
os.system
, was funktioniert, aber ...Escaping: Funktioniert
os.system
nur mit Dateinamen, die keine Leerzeichen oder andere Shell-Metazeichen im Pfadnamen enthalten (z. B.A:\abc\def\a.txt
), oder diese müssen maskiert werden. Es gibtshlex.quote
für Unix-ähnliche Systeme, aber nichts wirklich Standard für Windows. Vielleicht sehen Sie auch Python, Windows: Parsen von Befehlszeilen mit Shlexos.system("open " + shlex.quote(filename))
os.system("start " + filename)
Wo eigentlich gesagt,filename
sollte auch entkommen.Sie können sie auch über ein
subprocess
Modul aufrufen , aber ...Verwenden Sie für Python 2.7 und höher einfach
In Python 3.5+ können Sie das etwas komplexere, aber auch etwas vielseitigere verwenden
Wenn Sie bis zu Python 2.4 kompatibel sein müssen, können Sie
subprocess.call()
Ihre eigene Fehlerprüfung verwenden und implementieren:Was sind nun die Vorteile der Verwendung
subprocess
?'filename ; rm -rf /'
Problem gibt, aber Sie können eingeben. Wenn der Dateiname beschädigt werden kann, bietet die Verwendung vonsubprocess.call
wenig Schutz.retcode
in beiden Fällen immer noch abhängig von der ; Das Verhalten, im Falle eines Fehlers explizit eine Ausnahme auszulösen, hilft Ihnen sicherlich dabei, festzustellen, ob ein Fehler vorliegt (in einigen Szenarien ist ein Traceback jedoch möglicherweise nicht hilfreicher, als den Fehler einfach zu ignorieren).Zum Einwand "Wird
subprocess
aber bevorzugt." Esos.system()
ist jedoch nicht veraltet und in gewisser Weise das einfachste Werkzeug für diesen bestimmten Job. Fazit: Verwendenos.system()
ist daher auch eine richtige Antwort.Ein deutlicher Nachteil ist, dass Sie für den Windows-
start
Befehl eine Übergabe benötigen , dieshell=True
die meisten Vorteile der Verwendung zunichte machtsubprocess
.quelle
filename
die Form kommt, ist dies ein perfektes Beispiel dafür, warum os.system () unsicher und schlecht ist. Unterprozess ist besser.os.system()
ist, dass die Shell verwendet wird (und Sie hier keine Shell ausführen, sodass bei perfekt gültigen Dateinamen, die Shell-Metazeichen enthalten, schlechte Dinge passieren). Der Grund, warumsubprocess.call()
bevorzugt wird, ist, dass Sie die Option haben, die Shell mithilfe von zu umgehensubprocess.call(["open", filename])
. Dies funktioniert für alle gültigen Dateinamen und führt auch bei nicht vertrauenswürdigen Dateinamen nicht zu einer Sicherheitsanfälligkeit durch Shell-Injection.Verwenden Sie das
subprocess
unter Python 2.4+ verfügbare Modul nichtos.system()
, damit Sie sich nicht mit dem Entkommen von Shell befassen müssen.Die doppelten Klammern sind, weil
subprocess.call()
eine Sequenz als erstes Argument gewünscht wird, daher verwenden wir hier ein Tupel. Auf Linux-Systemen mit Gnome gibt es auch einengnome-open
Befehl, der dasselbe tut, jedochxdg-open
der Free Desktop Foundation-Standard ist und in allen Linux-Desktop-Umgebungen funktioniert.quelle
xdg-open
- linux.die.net/man/1/xdg-openxdg-open test.py
und es öffnete sich der Firefox-Download-Dialog für mich. Was ist los mit dir? Ich bin auf Manjaro Linux.xdg-open
Konfiguration verwirrt ist, aber das können wir in einem Kommentar nicht wirklich beheben . Vielleicht sehen Sie unix.stackexchange.com/questions/36380/…Ich bevorzuge:
Beachten Sie, dass dieses Modul Dateinamen unterstützt, deren Ordner und Dateien Leerzeichen enthalten, z
( Python-Dokumente ) 'Öffnen' muss nicht hinzugefügt werden (dies ist die Standardeinstellung). In den Dokumenten wird ausdrücklich erwähnt, dass dies einem Doppelklick auf das Symbol einer Datei im Windows Explorer entspricht.
Diese Lösung ist nur Windows.
quelle
startfile
Funktion aus irgendeinem Grund nicht vorhanden, anstatt einen Fehler auszulösen. Dies bedeutet, dass Benutzer eine verwirrende Fehlermeldung über eine fehlende Funktion erhalten. Möglicherweise möchten Sie die Plattform überprüfen, um dies zu vermeiden.Der Vollständigkeit halber (es war nicht in Frage) wird xdg-open unter Linux dasselbe tun.
quelle
quelle
Wenn Sie eine heuristische Methode verwenden müssen, können Sie dies in Betracht ziehen
webbrowser
.Es ist eine Standardbibliothek und würde trotz ihres Namens auch versuchen, Dateien zu öffnen:
Ich habe diesen Code ausprobiert und er hat unter Windows 7 und Ubuntu Natty einwandfrei funktioniert:
Dieser Code funktioniert auch in Windows XP Professional mit Internet Explorer 8 einwandfrei.
quelle
open location
dort verwendet, was funktionieren sollte, wenn Sie den Pfad als gültige URL angeben.import webbrowser webbrowser.open("file:///Users/nameGoesHere/Desktop/folder/file.py")
Wenn Sie den
subprocess.call()
Weg gehen möchten , sollte es unter Windows folgendermaßen aussehen:Sie können nicht einfach verwenden:
weil
start
ist keine ausführbare Datei, sondern ein Befehl descmd.exe
Programms. Das funktioniert:aber nur, wenn der FILE_NAME keine Leerzeichen enthält.
Während
subprocess.call
methodendie Parameter korrekt zitiert, hat derstart
Befehl eine ziemlich seltsame Syntax, wobei:macht etwas anderes als:
Die erste Zeichenfolge in Anführungszeichen sollte den Titel des Fensters festlegen. Damit es mit Räumen funktioniert, müssen wir Folgendes tun:
Das ist, was der Code oben tut.
quelle
Start unterstützt keine langen Pfadnamen und Leerzeichen. Sie müssen es in 8.3-kompatible Pfade konvertieren.
Die Datei muss vorhanden sein, um mit dem API-Aufruf arbeiten zu können.
quelle
start "Title" "C:\long path to\file.avi"
Ich bin ziemlich spät dran, aber hier ist eine Lösung mit der Windows-API. Dies öffnet immer die zugehörige Anwendung.
Viele magische Konstanten. Die erste Null ist die hwnd des aktuellen Programms. Kann Null sein. Die anderen beiden Nullen sind optionale Parameter (Parameter und Verzeichnis). 5 == SW_SHOW, gibt an, wie die App ausgeführt werden soll. Weitere Informationen finden Sie in den ShellExecute-API-Dokumenten .
quelle
os.startfile(file)
?Auf Mac OS können Sie "Öffnen" nennen.
Dies würde die Datei mit TextEdit oder einer anderen App öffnen, die als Standard für diesen Dateityp festgelegt ist
quelle
Wenn Sie die App angeben möchten, mit der die Datei unter Mac OS X geöffnet werden soll, verwenden Sie Folgendes:
os.system("open -a [app name] [file name]")
quelle
Unter Windows 8.1 haben die folgenden Funktionen funktioniert, während andere vorgegebene Methoden mit
subprocess.call
Fehlern mit Pfad Leerzeichen enthalten.Wenn Sie diese und die Antworten anderer zuvor verwenden, finden Sie hier einen Inline-Code, der auf mehreren Plattformen funktioniert.
quelle
os.startfile(path, 'open')
unter Windows ist gut, weil, wenn Leerzeichen im Verzeichnis vorhanden sind,os.system('start', path_name)
die App nicht korrekt geöffnet werden kann und wenn der i18n im Verzeichnis vorhanden ist,os.system
der Unicode in den Codec der Konsole in Windows geändert werden muss.quelle