2009-11-25 5 views
12

Ich denke etwas in Richtung des webbrowser Moduls, aber für Dateibrowser. In Windows möchte ich den Explorer öffnen, in GNOME unter Linux möchte ich Nautilus, Konqueror auf KDE usw. öffnen. Ich würde es vorziehen, es nicht zu blockieren, wenn ich es vermeiden kann. ;-)Gibt es eine plattformübergreifende Möglichkeit, einen Dateibrowser in Python zu öffnen?

+0

Seit " Dateibrowser "ist keine plattformübergreifende Funktion, worüber sprechen Sie eigentlich? Sprechen Sie über eine Art von GUI-Fenster, das "plattformübergreifend" ist? Welche GUI-Toolkits haben Sie betrachtet, die Ihrer Definition von "plattformübergreifend" entsprechen? –

+0

@ S.Lott: Kein Python-Prozess-eigenes GUI-Fenster - Beschuss zu einem nativen Subprozess in dem Sinne, wie es "webbrowser" tut, passend zur Betriebsumgebung des Benutzers. – cdleary

Antwort

16

Ich würde es vorziehen, nicht aufzuklopfen, wenn ich es vermeiden kann.

Weeell Ich glaube, Sie werden ein wenig von Plattform-Sniffing Flickschusterei müssen, aber hoffentlich nicht so viel wie der grässlichen Befehl Sniffing webbrowser Modul. Hier ist ein erster Stich:

Beachten Sie, dass die Win32-Version derzeit für Leerzeichen in Dateinamen fehlschlägt. Bug 2304 könnte etwas damit zu tun haben, aber es scheint ein grundlegendes Problem mit Parameter-Escaping und der Windows-Shell (cmd /c ...), in dem Sie keine doppelten Anführungszeichen verschachteln können und Sie können nicht-Anführungszeichen oder Leerzeichen . Ich habe es nicht geschafft, eine Möglichkeit zu finden, cmd /c start C:\Documents and Settings von der Befehlszeile überhaupt zu zitieren und auszuführen.

ETA re nosklo Kommentar: nur unter Windows gibt es eine eingebaute Möglichkeit, es zu tun:

if sys.platform=='win32': 
    os.startfile(d) 

Hier ist das nicht sehr-gute Alternative Lösung, um die Schale und öffnen Sie einen Ordner mit ihm zu finden , die Sie nicht jetzt sollte brauchen, aber ich werde in verlassen. (zum Teil, weil es sonst der Einsatz für etwas sein könnte, aber vor allem, weil ich die Zeit zu geben das verdammte Ding verbracht!)

if sys.platform=='win32': 
    import _winreg 
    path= r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon') 
    for root in (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE): 
     try: 
      with _winreg.OpenKey(root, path) as k: 
       value, regtype= _winreg.QueryValueEx(k, 'Shell') 
     except WindowsError: 
      pass 
     else: 
      if regtype in (_winreg.REG_SZ, _winreg.REG_EXPAND_SZ): 
       shell= value 
      break 
    else: 
     shell= 'Explorer.exe' 
    subprocess.Popen([shell, d]) 
+4

... oder os.startfile() verwenden – nosklo

+0

Oh ja, das ist viel besser! – bobince

+1

Es wäre nett, dies global unterstützt zu haben, wie in http://bugs.python.org/issue3177 beschrieben – bobince

-1

Dies ist ein kompletter Stich im Dunkeln, aber werfen Sie einen Blick auf wxPython, die Python-Bindungen zu der zugrunde liegenden wxWidgets Bibliothek bietet. Es ist lange her, seit ich es zum letzten Mal gesehen habe, aber da könnte etwas sein, das du benutzen kannst. Andernfalls sollte es relativ einfach sein, einen eigenen Dateibrowser zu erstellen, der die systemeigenen "Widgets" für jedes Betriebssystem verwendet.

Wohlgemerkt, wxPython ist nicht leicht, es wird wirklich Ihre Anwendung auffüllen und Ihre Abhängigkeiten erhöhen.

-1

Ich weiß nicht, ob ein ready-to-use-Modul vorhanden ist, aber wenn es ist, sollte es auf dem Python cookbok (http://code.activestate.com/recipes/langs/python/)

auch, zumindest in gnome und auf mac os Active sein, Sie können "gnome-open http://blah" und "öffnen Sie http://blah" (auf Mac) ausführen; Beide öffnen die URL im bevorzugten Browser des Benutzers.

Für Linux überprüfen Sie auch Freedesktop.org - eine gemeinsame Reihe von Tools für beide Gnome und KDE, die etwas ähnliches enthalten sollte.

Verwandte Themen