2013-06-26 8 views
15

Ich möchte ein Programm auf verschiedenen Plattformen (einschließlich Mac OS) ausführen, also versuche ich, es so plattformunabhängig wie möglich zu halten. Ich benutze Windows selbst, und ich habe eine Zeile os.startfile(file). Das funktioniert für mich, aber nicht auf anderen Plattformen (ich habe in der Dokumentation nachgelesen, habe ich nicht selbst getestet).Gibt es ein plattformunabhängiges Äquivalent von os.startfile()?

Gibt es ein Äquivalent, das für alle Plattformen funktioniert?

Übrigens ist die Datei eine .wav Datei, aber ich möchte, dass Benutzer ihren Standard-Media-Player verwenden können, so dass sie die Datei anhalten/zurückspulen können. Deshalb verwende ich os.startfile(). Ich könnte vielleicht mit Bibliotheken arbeiten, die auch das Abspielen/Anhalten/Zurückspulen von Mediendateien erlauben.

+0

Versuchen Sie: http://www.pygame.org/project-Python+Media+Player-185-.html –

+0

verwandt: [Starten Sie ein anderes Programm von Python> Separat <] (http://stackoverflow.com/q/13078071/4279) – jfs

Antwort

26

Offenbar gibt es noch kein plattformübergreifendes Dateieröffnungsmodul, aber Sie können sich auf die vorhandene Infrastruktur der gängigen Systeme verlassen. Dieser Ausschnitt umfasst Windows, MacOS und Unix-ähnliche Systeme (Linux, FreeBSD, Solaris ...):

import os, sys, subprocess 

def open_file(filename): 
    if sys.platform == "win32": 
     os.startfile(filename) 
    else: 
     opener ="open" if sys.platform == "darwin" else "xdg-open" 
     subprocess.call([opener, filename]) 
+0

Danke, ich hoffe, das funktioniert. Ich werde Ihre Antwort akzeptieren, sobald ich das Programm auf anderen Plattformen testen kann. – Lewistrick

+0

Für Windows sollten die Zitate um den Dateinamen weggelassen werden. Gilt das für andere Plattformen? – Lewistrick

+0

@Lewistrick Ohne die Anführungszeichen Dateien mit Leerzeichen in Datei oder Verzeichnisname wird nicht funktionieren, was immer ein Fehler ist, der darauf wartet, zu passieren. Ich habe jetzt die Antwort bearbeitet, um einfach 'os.startfile' in Win32 zu verwenden und/xdg-open an anderer Stelle zu öffnen. Da Windows nun separat behandelt wird, kann der Code 'subprocess.call' verwenden, um Dateinamen mit Leerzeichen oder Sonderzeichen zu behandeln. (Unter Windows 'start' ist ein Teil von' cmd', also 'subprocess.call' ohne' shell = True' würde nicht funktionieren.) – user4815162342

1

Nur webbrowser.open(filename) verwenden. Es kann os.startfile(), open, xdg-open wo erforderlich anrufen.

Vorsicht, es ist ein scary text in the docs:

Beachten Sie, dass auf einigen Plattformen, einen Dateinamen mit dieser Funktion zu öffnen versuchen, arbeiten können und starten Sie das Programm zugeordnet des Betriebssystems. Dies ist jedoch weder unterstützt noch tragbar.

Es funktioniert gut für mich. Testen Sie es in Ihrer Umgebung.

Betrachten Sie webbrower's source code, um zu sehen, wie viel Arbeit getan werden muss, um tragbar zu sein.

Es gibt auch ein offenes Problem auf Python Bug Tracker - Add shutil.open. "portable os.startfile()" schnittstelle erwies sich als komplexer als erwartet. Sie könnten die eingereichten Patches z. B. shutil.launch() ausprobieren.

+0

Dies funktioniert nicht unter OS X. Sowohl auf Python 2.7 als auch auf Python 3 gibt dies 'True' zurück, tut aber eigentlich nichts. –

+0

@LukeTaylor Ich glaube, Webbrowser verwendet 'open' Befehl auf OS X. Wenn es für Sie nicht funktioniert, dann erstellen Sie einen minimalen Code Beispiel und veröffentlichen Sie es als eine separate Frage. – jfs

+0

Es ist keine große Sorge für mich, ich wollte dich nur wissen lassen. –

Verwandte Themen