2009-11-25 12 views
12

Sto pensando qualcosa sulla falsariga del modulo webbrowser, ma per i browser di file. In Windows mi piacerebbe aprire explorer, in GNOME su Linux voglio aprire nautilus, Konqueror su KDE, ecc. Preferirei non rimuoverlo se posso evitarlo. ;-)Esiste un modo multipiattaforma per aprire un browser di file in Python?

+0

Dal " browser di file "non è una funzionalità multipiattaforma, di cosa - in particolare - stai parlando? Stai parlando di una sorta di finestra della GUI che è "multipiattaforma"? Quale toolkit della GUI hai guardato che soddisfa la tua definizione di "multipiattaforma"? –

+0

@ S.Lott: non una finestra GUI di proprietà del processo Python, che esegue il shelling in un sottoprocesso nativo nello stesso senso di "webbrowser", appropriato per l'ambiente operativo dell'utente. – cdleary

risposta

16

Preferirei non comprimerlo se posso evitarlo.

Weeell Penso che si sta per bisogno di un po 'di ripiego piattaforma sniffing, ma si spera non tanto quanto l'orribile modulo di comando-sniffing webbrowser. Ecco un primo tentativo:

if sys.platform=='win32': 
    subprocess.Popen(['start', d], shell= True) 

elif sys.platform=='darwin': 
    subprocess.Popen(['open', d]) 

else: 
    try: 
     subprocess.Popen(['xdg-open', d]) 
    except OSError: 
     # er, think of something else to try 
     # xdg-open *should* be supported by recent Gnome, KDE, Xfce 

Nota la versione win32 al momento non riesce per gli spazi nei nomi di file. Bug 2304 potrebbe essere qualcosa a che fare con questo, ma sembra esserci un problema di base con l'escaping dei parametri e la shell di Windows (cmd /c ...), in quanto non è possibile annidare le virgolette doppie e non è possibile usare^-escape virgolette o spazi . Non sono riuscito a trovare alcun modo per quotare ed eseguire cmd /c start C:\Documents and Settings dalla riga di comando.

ETA re commento di nosklo: solo su Windows, c'è un modo integrato per farlo:

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

Ecco la soluzione alternativa non-molto-bello per trovare il guscio e aprire una cartella con esso , che non si dovrebbe ora hanno bisogno, ma lascio a. (in parte perché potrebbe essere utile per qualcos'altro, ma soprattutto perché ho passato il tempo di digitare la cosa maledetta!)

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

... o usa os.startfile() – nosklo

+0

Oh sì, è molto meglio! – bobince

+1

Sarebbe bello avere questo supportato globalmente, come per http://bugs.python.org/issue3177 – bobince

-1

Questa è una pugnalata completa al buio, ma date un'occhiata a wxPython che fornisce collegamenti Python alla sottostante libreria wxWidgets. È passato molto tempo dall'ultima volta che l'ho guardato, ma potrebbe esserci qualcosa che puoi usare. Altrimenti, dovrebbe essere relativamente facile creare il proprio browser di file che utilizzerà i "widget" nativi per ciascun sistema operativo.

Attenzione, wxPython non è un peso leggero, ma accresce la tua applicazione e aumenta le tue dipendenze.

-1

non so se esiste un modulo pronto per l'uso, ma se c'è, dovrebbe essere sul cookbok pitone della ActiveState (http://code.activestate.com/recipes/langs/python/)

Inoltre, almeno in GNOME e sul mac os, è possibile eseguire "gnome-open http://blah" e "apri http://blah" (su mac); entrambi apriranno l'url nel browser preferito dell'utente.

Per linux controllare anche freedesktop.org - un set comune di strumenti che copre sia Gnome che KDE, che dovrebbero includere qualcosa di simile.

Problemi correlati