python 的 webbrowser 在 Windows 相对路径上启动 IE,而不是默认浏览器

新手上路,请多包涵

我正在尝试在默认浏览器中从 python 启动本地 html 文件(现在我的默认浏览器是 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 上。为什么 Chrome 无法启动?

更新:代码将在未知操作系统和机器上运行,因此硬编码或注册浏览器或路径更新不是选项。我在想解析 file:// 的 url,然后执行 os.path.exists 检查和 os.path.realpath 可能就是答案。

原文由 McLeopold 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 836
2 个回答

我的主要问题是尝试将 file:// 添加到相对路径之前的错误 URL。它可以用这个修复:

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

使用 webbrowser.open 将尝试多种方法,直到一个“成功”,这是一个松散的定义。

WindowsDefault 类调用 os.startfile() 失败并返回 False 。我可以通过在 Windows 运行命令中输入 URL 并看到一条错误消息而不是浏览器来验证这一点。

Both GenericBrowser and BackgroundBrowser will call subprocess.Popen() with an exe which will succeed, even with a bad URL, and return 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 env var 或修改我的路径都会让我获得正确的浏览器和更好的错误消息。

感谢您的帮助,没有您的想法我无法解决这个问题。

原文由 McLeopold 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 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 的预定义默认值。

原文由 Acorn 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题