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))
Using webbrowser.open
will try multiple methods until one "succeeds", which is a loose definition.
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.
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
is set by the environment variable BROWSER
and is first.
WindowsDefault
is second.
BackgroundBrowser
is last and includes the fall back IE if nothing else works.
Here is my original setup:
>>> 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>])]
>>>
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.
webbrowser.register
and theBROWSER
environment variable it would be good information to have. The docs don't go into much detail. – Lowder'file://'
in combination with a relative path is causing the issue. If I drop the'file://'
or useos.path.realpath(filename)
it works, and google launches. I'm still wondering why a bad file url would then fall back to IE with a blank address bar. – Engraving