Python的webbrowser在Windows上通过相对路径打开IE,而非默认浏览器

41 投票
14 回答
36659 浏览
提问于 2025-04-16 17:09

我想从Python中打开一个本地的HTML文件,使用默认的浏览器(现在我的默认浏览器是谷歌浏览器,如果我双击一个.html文件,谷歌浏览器就会打开)。

但是当我用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

我检查过我的默认程序,看起来没问题。我是在Windows 7 SP1上。为什么谷歌浏览器没有打开呢?

更新:这段代码会在不确定的操作系统和机器上运行,所以不能硬编码或者注册浏览器或更新路径。我在想,解析URL中的file://,然后做一个os.path.exists的检查和os.path.realpath的操作,可能是解决办法。

14 个回答

11

这段代码在我这里打开了一个新的Chrome标签页,而且它不依赖于操作系统:

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

奇怪的是,如果不使用get()这个调用,它还是会用IE浏览器。这看起来像是一个小错误,但有个简单的方法可以解决。

16

你可以使用 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的预定义默认浏览器。

29

我遇到的主要问题是因为试图在相对路径前加上 file://,导致了一个错误的链接。可以通过以下方式解决这个问题:

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

使用 webbrowser.open 会尝试多种方法,直到找到一个“成功”的方式,这里的“成功”定义得比较宽泛。

WindowsDefault 类会调用 os.startfile(),但这会失败并返回 False。我可以通过在Windows的运行命令中输入这个链接来验证,结果是出现了错误信息,而不是打开浏览器。

GenericBrowserBackgroundBrowser 会使用 subprocess.Popen() 来调用一个可执行文件,即使链接有问题也会成功,并返回 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环境变量,或者修改了我的路径,都会让我找到正确的浏览器,并且能得到更好的错误信息。

谢谢大家的帮助,没有你们的建议我无法解决这个问题。

撰写回答