El navegador web de Python lanza IE en lugar de predeterminado en Windows 7

Estoy intentando lanzar un archivo html local desde Python en el navegador predeterminado. En este momento mi valor predeterminado es google chrome. Si hago doble clic en un archivo .html, se inicia Chrome.

Cuando uso webbrowser.open de python, IE se inicia en su lugar, con una barra de direcciones en blanco.

Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import webbrowser >>> filename = 'test.html' >>> webbrowser.open('file://'+filename) True >>> print(webbrowser.get().__class__.__name__) WindowsDefault 

He comprobado mis progtwigs por defecto y se ven correctos. Estoy en Win 7 SP1. ¿Por qué no se está lanzando Chrome?

Actualización : el código se ejecutará en sistemas operativos y máquinas desconocidos, por lo que el registro de los navegadores o las actualizaciones de ruta no son opciones. Estoy pensando que analizar la url para el file:// y luego hacer una comprobación os.path.realpath y os.path.realpath podría ser la respuesta.

Mi principal problema era una URL incorrecta al intentar anteponer el file:// a una ruta relativa. Se puede arreglar con esto:

 webbrowser.open('file://' + os.path.realpath(filename)) 

El uso de webbrowser.open probará varios métodos hasta que uno “tenga éxito”, que es una definición vaga.

La clase WindowsDefault llama a os.startfile() que falla y devuelve False . Puedo verificar que al ingresar la URL en el comando de ejecución de Windows y ver un mensaje de error en lugar de un navegador.

Tanto GenericBrowser como BackgroundBrowser llamarán subprocess.Popen() con un exe que tendrá éxito, incluso con una URL incorrecta, y devolverá True . IE no da ninguna indicación del problema, todos los demás navegadores tienen mensajes agradables que dicen que no pueden encontrar el archivo.

  1. GenericBrowser se establece mediante la variable de entorno BROWSER y es la primera.
  2. WindowsDefault es el segundo.
  3. BackgroundBrowser es el último e incluye el IE de retroceso si nada más funciona.

Aquí está mi configuración original:

 >>> import webbrowser >>> webbrowser._tryorder ['windows-default', 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE'] >>> webbrowser._browsers.items() [('windows-default', [, None]), ('c:\\program files\\internet explorer\\iexplore.exe', [None, ])] >>> 

Aquí está mi configuración después de modificar las variables de entorno:

 C:>path=C:\Program Files (x86)\Mozilla Firefox;%path% C:>set BROWSER=C:\Users\Scott\AppData\Local\Google\Chrome\Application\chrome.exe C:>python Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import webbrowser >>> webbrowser._tryorder ['C:\\Users\\Scott\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe', 'windows-default', 'firefox', 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE'] >>> webbrowser._browsers.items() [('windows-default', [, None]), ('c:\\program files\\internet explorer\\iexplore.exe',[None, ]), ('firefox', [None, ]), ('c:\\users\\scott\\appdata\\local\\google\\chrome\\application\\chrome.exe', [None, ])] >>> 

El webbrowser._tryorder proporciona la lista de navegadores probados. Registrar Chrome o agregar una envolvente de NAVEGACIÓN o modificar mi ruta me habría dado el navegador correcto con un mejor mensaje de error.

Gracias por la ayuda, chicos, no podría haber resuelto esto sin sus ideas.

Puedes usar get(name) para usar un navegador específico.

Deberá registrar el navegador web Chrome , ya que no parece ser uno de los tipos de navegador predefinidos , y entonces debería poder hacer esto:

webbrowser.get('chrome').open('http://www.google.com')

Actualizar:

En realidad, es posible que solo puedas uno de los siguientes:

webbrowser.get('windows-default').open('http://www.google.com') webbrowser.get('macosx').open('http://www.google.com')

Los documentos no muestran valores predeterminados predefinidos para Linux.

Esto me abrió una nueva pestaña de Chrome, y sigue siendo independiente del sistema operativo:

 webbrowser.get().open('http://www.google.com') 

Lo que es extraño es que sin la llamada get() , todavía usa IE. Esto parece un error con una solución simple.

Se supone que el módulo del navegador web utiliza el navegador predeterminado, por lo que podría tratarse de un error. Por otro lado, use esta explicación de la documentación para solucionar su problema:

Si existe la variable de entorno BROWSER, se interpreta que anula la lista de navegadores predeterminada de la plataforma, como una lista de navegadores separados por os.pathsep para probar en orden. Cuando el valor de una parte de la lista contiene la cadena% s, se interpreta como una línea de comando de navegador literal para usar con el argumento URL sustituido por% s; Si la parte no contiene% s, simplemente se interpreta como el nombre del navegador que se iniciará.

Al observar el código fuente del módulo , primero intenta usar el navegador predeterminado de Windows, pero si no funciona, busca los nombres comunes del navegador que son comandos, es decir. que están en la variable PATH. Intente agregar la ubicación de su navegador web a su RUTA.

Tengo el mismo problema con firefox. http://www.google.com se abre en ff mientras que file: ///test.html se abre en IE.

webbrowser doc dice:

Tenga en cuenta que en algunas plataformas, al intentar abrir un nombre de archivo utilizando esta función, puede funcionar e iniciar el progtwig asociado del sistema operativo. Sin embargo, esto no es compatible ni portátil.

Con Windows 10, en resumen, todo lo que no incluye una URL completa en el formato https://example.com se abre en IE para mí. Por ejemplo, si digo

 webbrowser.open("https://www.example.com") 

se abrirá una nueva pestaña en Chrome, mientras que

 webbrowser.open("example.com") 

abrirá IE. Cualquier .get() hará que no abra ningún navegador.

Tipo de comportamiento extraño, pero puedo ver que esto es algo complejo de implementar y probablemente el sistema operativo es el culpable de este comportamiento.

Este problema aparece solo para mí con el file:/// URL de protocolo, que probablemente no están registrados en Chrome, por lo que os.startfile () (que es lo primero que intenta webbrowser.open en Windows) los abre en Internet Explorer. No creo que poner tu otro navegador en PATH te ayude, ya que os.startfile () aún se invoca incluso antes de probar los navegadores en la ruta.

Lo que puede hacer es verificar el navegador predeterminado para http:// en el registro (por ejemplo, verificando la clave de registro HKEY_CLASSES_ROOT\http\shell\open\command ) y usar esa para el file:/// URL. No es bonito, pero debería funcionar.

 import _winreg import webbrowser import shlex import subprocess def win_browser_open(url): if url.startswith('file:///'): browser = _winreg.QueryValue(_winreg.HKEY_CLASSES_ROOT, r'http\shell\open\command') browser = browser.replace('%1', url) subprocess.Popen(shlex.split(browser)) else: webbrowser.open(url)