python的webbrowser在Windows相对路径上启动IE,而不是默认浏览器 [英] python's webbrowser launches IE, instead of default browser, on Windows relative path
问题描述
我试图在默认浏览器中从python启动本地html文件(现在,如果我双击.html文件,我的默认浏览器是Google Chrome浏览器.)
I'm attempting to launch a local html file from python in the default browser (right now my default is Google Chrome if I double-click on a .html file, Chrome launches.)
当我使用python的 webbrowser.open()
时,IE会启动,并显示一个空白地址栏.
When I use python's webbrowser.open()
, IE launches instead, with a blank address bar.
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无法启动?
I've checked my default programs and they look correct. I'm on Win 7 SP1. Why is Chrome not launching?
更新:该代码将在未知的操作系统和机器上运行,因此硬编码或注册浏览器或路径更新不是可选项.我在想解析 file://
的url,然后进行 os.path.exists
检查和 os.path.realpath
可能就是答案.
Update: The code will be running on unknown OS's and machines, so hardcoding or registering browsers or path updates are not options. I'm thinking that parsing the url for file://
and then doing an os.path.exists
check and os.path.realpath
might be the answer.
推荐答案
我的主要问题是尝试将 file://
附加到相对路径之前,URL错误.可以通过以下方法解决:
My main issue was a bad URL by attempting prepend file://
to a relative path. It can be fixed with this:
webbrowser.open('file://' + os.path.realpath(filename))
使用 webbrowser.open
将尝试多种方法,直到一个成功"为止,这是一个松散的定义.
Using webbrowser.open
will try multiple methods until one "succeeds", which is a loose definition.
WindowsDefault
类调用 os.startfile()
失败,并返回 False
.我可以通过在Windows run命令中输入URL并看到错误消息而不是浏览器来验证这一点.
The WindowsDefault
class calls os.startfile()
which fails and returns False
. I can verify that by entering the URL in the windows run command and seeing an error message rather than a browser.
GenericBrowser
和 BackgroundBrowser
都将使用一个exe调用 subprocess.Popen()
,即使该URL错误,该exe也会成功执行并返回 True
.IE并未提供该问题的迹象,所有其他浏览器均显示一条不错的消息,提示它们找不到该文件.
Both GenericBrowser
and BackgroundBrowser
will call subprocess.Popen()
with an exe which will succeed, even with a bad URL, and return True
. IE gives no indication of the issue, all other browsers have a nice messages saying they can't find the file.
-
GenericBrowser
由环境变量BROWSER
设置,并且是第一个. -
WindowsDefault
是第二名. -
BackgroundBrowser
是最后一个,如果没有其他作用,则包括回退IE.
GenericBrowser
is set by the environment variableBROWSER
and is first.WindowsDefault
is second.BackgroundBrowser
is last and includes the fall back IE if nothing else works.
这是我的原始设置:
>>> 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>])]
>>>
这是修改环境变量后的设置:
Here is my setup after modifiying the environment variables:
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或修改我的路径,都会使我获得正确的浏览器,并获得更好的错误消息.
The webbrowser._tryorder
gives the list of browsers tried. Registering chrome or adding a BROWSER env var or modifiying my path all would have gotten me the correct browser with a better error message.
感谢帮助人员,没有您的想法我无法解决.
Thanks for the help guys, I couldn't have solved this without your ideas.
这篇关于python的webbrowser在Windows相对路径上启动IE,而不是默认浏览器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!