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?
risposta
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])
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.
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.
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"? –
@ 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