Подтвердить что ты не робот

Python webbrowser запускает IE вместо стандартного для Windows 7

Я пытаюсь запустить локальный 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. Почему хром не запускается?

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

4b9b3361

Ответ 1

Моей главной проблемой был плохой 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 не дает никаких указаний на эту проблему, все другие браузеры имеют хорошие сообщения о том, что они не могут найти файл.

  • GenericBrowser задается переменной окружения BROWSER и является первым.
  • WindowsDefault является вторым.
  • 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 показывает список браузеров. Регистрация хрома или добавление BROWSER env var или модификация моего пути привели бы ко мне правильный браузер с лучшим сообщением об ошибке.

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

Ответ 2

Вы можете использовать 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.

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

webbrowser doc говорит:

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

Ответ 7

Эта проблема возникает для меня только с 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)

Ответ 8

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

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

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

webbrowser.open("example.com")

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

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