2009-11-25 10 views
12

Estoy pensando algo así como en el módulo webbrowser, pero para navegadores de archivos. En Windows, me gustaría abrir el explorador, en GNOME en Linux, quiero abrir Nautilus, Konqueror en KDE, etc. Prefiero no criticarlo si puedo evitarlo. ;-)¿Existe alguna forma de plataforma cruzada para abrir un buscador de archivos en Python?

+0

Desde " buscador de archivos "no es una función multiplataforma, ¿de qué está hablando específicamente? ¿Estás hablando de algún tipo de ventana GUI que es "multiplataforma"? ¿Qué herramientas GUI has visto que cumplan con tu definición de "multiplataforma"? –

+0

@ S.Lott: No es una ventana de la GUI propiedad del proceso de Python: realizar un bombardeo en un subproceso nativo en el mismo sentido en que lo hace 'webbrowser', apropiado para el entorno operativo del usuario. – cdleary

Respuesta

16

Preferiría no arriesgarme si puedo evitarlo.

Weeell creo que va a necesitar un poco de kludge plataforma rastreadores, pero espero que no tanto como el módulo de comando espantosa rastreadores webbrowser. He aquí una primera puñalada en ella:

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 versión Win32 Actualmente fallará para espacios en los nombres de archivo. Bug 2304 podría tener algo que ver con eso, pero parece que hay un problema básico con el escape de parámetros y el shell de Windows (cmd /c ...), en el sentido de que no puede anidar comillas dobles y no puede^-escape citas o espacios . No he logrado encontrar ninguna manera de citar y ejecutar cmd /c start C:\Documents and Settings desde la línea de comandos.

ETA re comentario de nosklo: sólo en Windows, hay una forma integrada de hacerlo:

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

Aquí está la solución alternativa no muy agradable para encontrar la cáscara y abrir una carpeta con ella , que usted no debe necesitar ahora, pero voy a dejar en. (en parte porque podría ser de utilidad para otra cosa, pero sobre todo porque me he pasado el tiempo para escribir la maldita cosa!)

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 use os.startfile() – nosklo

+0

¡Oh, sí, eso es mucho mejor! – bobince

+1

Sería bueno tener este soporte global, según http://bugs.python.org/issue3177 – bobince

-1

Esta es una puñalada completa en la oscuridad, pero echa un vistazo a wxPython que proporciona enlaces de Python a la biblioteca subyacente wxWidgets. Ha pasado mucho tiempo desde la última vez que lo miré, pero podría haber algo allí que puedas usar. De lo contrario, debería ser relativamente fácil crear su propio explorador de archivos que usará los "widgets" nativos para cada sistema operativo.

Tenga en cuenta que wxPython no es liviano, realmente aumentará su aplicación y aumentará sus dependencias.

-1

no sé si existe un módulo listo para su uso, pero si la hay, que debería estar en cookbok pitón del Activestate (http://code.activestate.com/recipes/langs/python/)

también, al menos en GNOME y en Mac OS, puede ejecutar "gnome-open http://blah" y "abrir http://blah" (en mac); ambos abrirán la url en el navegador preferido del usuario.

Para Linux también consulte freedesktop.org - un conjunto común de herramientas que cubre tanto Gnome como KDE, que debería incluir algo similar.

Cuestiones relacionadas