Веб-браузер python запускает IE вместо стандартного в Windows 7 - PullRequest
31 голосов
/ 06 мая 2011

Я пытаюсь запустить локальный html-файл из python в браузере по умолчанию. Прямо сейчас я по умолчанию Google Chrome. Если дважды щелкнуть файл .html, Chrome запустится.

Когда я использую python webbrowser.open, вместо этого запускается IE с пустой адресной строкой.

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

Я проверил свои программы по умолчанию, и они выглядят правильно. Я на Win 7 SP1. Почему Chrome не запускается?

Обновление : код будет работать на неизвестных ОС и компьютерах, поэтому регистрация браузеров или обновлений пути не предусмотрена Я думаю, что анализ URL для file://, а затем выполнение проверки os.path.exists и os.path.realpath может быть ответом.

Ответы [ 9 ]

22 голосов
/ 10 мая 2011

Моей основной проблемой был неправильный URL, пытаясь добавить file:// к относительному пути. Это можно исправить с помощью:

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

Использование webbrowser.open будет пытаться использовать несколько методов до тех пор, пока один из них не будет "успешным", что является слабым определением.

Класс WindowsDefault вызывает os.startfile(), который завершается ошибкой и возвращает False. Я могу убедиться в этом, введя URL-адрес в команду запуска Windows и увидев сообщение об ошибке, а не браузер.

И GenericBrowser, и BackgroundBrowser будут вызывать subprocess.Popen() с exe-файлом, который преуспеет, даже с неверным URL, и вернут True. IE не дает никаких указаний на проблему, все другие браузеры имеют хорошие сообщения о том, что они не могут найти файл.

  1. GenericBrowser устанавливается переменной среды BROWSER и является первым.
  2. WindowsDefault является вторым.
  3. BackgroundBrowser является последним и включает резервный IE, если ничего не работает.

Вот моя первоначальная установка:

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

Вот мои настройки после изменения переменных среды:

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', [<class 'webbrowser.WindowsDefault'>, None]),
 ('c:\\program files\\internet explorer\\iexplore.exe',[None, <webbrowser.BackgroundBrowser object at 0x000000000235E828>]),
 ('firefox', [None, <webbrowser.BackgroundBrowser object at 0x000000000235E780>]),
 ('c:\\users\\scott\\appdata\\local\\google\\chrome\\application\\chrome.exe', [None, <webbrowser.GenericBrowser object at 0x000000000235E8D0>])]
>>>

В webbrowser._tryorder отображается список опробованных браузеров. Регистрация chrome или добавление BROWSER env var или изменение моего пути - все это позволило бы мне получить правильный браузер с лучшим сообщением об ошибке.

Спасибо за помощь, ребята, я бы не смог решить это без ваших идей.

14 голосов
/ 06 мая 2011

Вы можете использовать get(name) для использования определенного браузера.

Вам необходимо зарегистрировать браузер Chrome , поскольку он не относится к одному из предопределенных типов браузеров , и тогда вы сможете сделать это:

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

Обновление:

На самом деле, вы можете выбрать одно из следующих действий:

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

В документах нет предопределенных значений по умолчанию для Linux.

7 голосов
/ 08 июля 2012

Это открыло для меня новую вкладку Chrome, и она все еще не зависит от ОС:

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

Странно то, что без вызова get() он все еще использует IE. Это похоже на ошибку с простым обходным путем.

2 голосов
/ 06 мая 2011

Модуль webbrowser должен использовать браузер по умолчанию, так что это может быть ошибкой. С другой стороны, используйте это объяснение из документов для устранения проблемы:

Если переменная окружения BROWSER существует, это интерпретируется как переопределение список браузеров по умолчанию для платформы, как список, разделенный os.pathsep браузеры попробовать по порядку. Когда значение части списка содержит Строка% s, то это интерпретируется как литеральная командная строка браузера будет используется с замененным аргументом URL для% s; если часть не содержит % s, это просто интерпретируется как имя браузера для запуска.

1 голос
/ 18 марта 2017

Короче говоря, в Windows 10 все, что не содержит полного URL-адреса в формате https://example.com, открывается в IE для меня. Например, если я скажу

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

откроет новую вкладку в Chrome, а

webbrowser.open("example.com")

откроет IE. Любой .get() приведет к тому, что он вообще не откроет браузер.

Довольно странное поведение, но я вижу, что это сложная вещь, которую нужно реализовать, и, вероятно, ОС виновата в этом.

1 голос
/ 06 мая 2011

У меня такая же проблема с Firefox. http://www.google.com открывается в ff, а в IE открывается файл: ///test.html.

документ для веб-браузера говорит:

Обратите внимание, что на некоторых платформах пытаются открыть имя файла с помощью этой функции, может работать и начать работу связанная с системой программа. Тем не мение, это не поддерживается и не портативный.

1 голос
/ 06 мая 2011

Глядя на исходный код модуля , он сначала пытается использовать браузер Windows по умолчанию, но если он не работает, он ищет общие имена браузеров, которые являются командами, т.е.которые находятся в переменной PATH.Попробуйте добавить местоположение вашего веб-браузера в PATH.

0 голосов
/ 24 мая 2019

То, что у меня работало с Python 3.6, Windows 10, использовало функцию register() с BackgroundBrowser, чтобы войти в мой нужный браузер:

import webbrowser

# Register your preferable browser
browser_path = 'C:/path/to/opera.exe'
webbrowser.register('opera', None, webbrowser.BackgroundBrowser(browser_path))

# Get an instance and launch your file
browser = webbrowser.get('opera') 
browser.open('html_file')

Бонус наблюдения -

webbrowser также имеет класс GenericBrowser.

Глядя на источник , кажется, BackgroundBrowser использует start_new_session при вызове subprocess.Popen(), тогда как GenericBrowser - нет.

Я не в курсеТочная функциональность этого флага.

Практически, однако, использование BackgroundBrowser переключает в окно браузера, в то время как GenericBrowser просто открывает вкладку, но не переключается.

0 голосов
/ 07 мая 2011

Эта проблема возникает для меня только с URL-адресами протокола file:///, которые, вероятно, не зарегистрированы в chrome, поэтому os.startfile () (это первое, что webbrowser.open пытается в Windows) открывает их в Internet Explorer.Я не думаю, что установка вашего другого браузера в PATH поможет, так как os.startfile () все еще вызывается до того, как вы попробуете браузеры по пути.

То, что вы можете сделать,проверить браузер по умолчанию на http:// в реестре (например, проверив ключ реестра HKEY_CLASSES_ROOT\http\shell\open\command) и использовать его для file:/// URL-адресов.Не красиво, но должно работать.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...