Python的webbrowser在Windows上通过相对路径打开IE,而非默认浏览器
我想从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 个回答
这段代码在我这里打开了一个新的Chrome标签页,而且它不依赖于操作系统:
webbrowser.get().open('http://www.google.com')
奇怪的是,如果不使用get()
这个调用,它还是会用IE浏览器。这看起来像是一个小错误,但有个简单的方法可以解决。
你可以使用 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的预定义默认浏览器。
我遇到的主要问题是因为试图在相对路径前加上 file://
,导致了一个错误的链接。可以通过以下方式解决这个问题:
webbrowser.open('file://' + os.path.realpath(filename))
使用 webbrowser.open
会尝试多种方法,直到找到一个“成功”的方式,这里的“成功”定义得比较宽泛。
WindowsDefault
类会调用 os.startfile()
,但这会失败并返回 False
。我可以通过在Windows的运行命令中输入这个链接来验证,结果是出现了错误信息,而不是打开浏览器。
而 GenericBrowser
和 BackgroundBrowser
会使用 subprocess.Popen()
来调用一个可执行文件,即使链接有问题也会成功,并返回 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
列出了尝试过的浏览器。如果我注册了Chrome,或者添加了BROWSER环境变量,或者修改了我的路径,都会让我找到正确的浏览器,并且能得到更好的错误信息。
谢谢大家的帮助,没有你们的建议我无法解决这个问题。