39

我正在尝试在默认浏览器中从 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://然后进行os.path.exists检查,os.path.realpath这可能是答案。

4

13 回答 13

29

我的主要问题是通过尝试file://添加到相对路径来获取错误的 URL。可以这样修复:

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

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

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

两者GenericBrowserBackgroundBrowser都将subprocess.Popen()使用一个成功的 exe 调用,即使 URL 不正确,并返回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 或修改我的路径都会为我提供正确的浏览器和更好的错误消息。

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

于 2011-05-09T23:50:34.693 回答
16

您可以使用get(name)特定的浏览器。

您需要注册 Chrome webbrowser,因为它似乎不是预定义的浏览器类型之一,然后您应该可以这样做:

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 的预定义默认值。

于 2011-05-06T19:53:01.933 回答
8

这为我打开了一个新的 Chrome 标签,它仍然独立于操作系统:

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

奇怪的是,没有get()调用,它仍然使用 IE。这看起来像一个简单的解决方法的错误。

于 2012-07-08T14:41:21.003 回答
2

webbrowser模块应该使用默认浏览器,所以这可能是一个错误。另一方面,使用文档中的解释来解决您的问题:

如果环境变量 BROWSER 存在,它被解释为覆盖浏览器的平台默认列表,作为 os.pathsep 分隔的浏览器列表按顺序尝试。当列表部分的值包含字符串 %s 时,它会被解释为文字浏览器命令行,以使用参数 URL 代替 %s;如果该部分不包含 %s,则它被简单地解释为要启动的浏览器的名称。

于 2011-05-06T19:54:29.447 回答
2

简而言之,使用 Windows 10,格式中不包含完整 URL 的所有内容都会https://example.com在 IE 中为我打开。例如,如果我说

webbrowser.open("https://www.example.com")

它将在 Chrome 中打开一个新标签页,同时

webbrowser.open("example.com")

将打开IE。任何.get()都会导致它根本无法打开浏览器。

有点奇怪的行为,但我可以看到这是一个复杂的事情,很可能是操作系统应该为这种行为负责。

于 2017-03-18T10:56:54.713 回答
1

查看模块源代码,它首先尝试使用 Windows 默认浏览器,但如果它不起作用,它会搜索作为命令的常见浏览器名称,即。在 PATH 变量中。尝试将 Web 浏览器的位置添加到 PATH。

于 2011-05-06T19:53:55.420 回答
1

我对firefox也有同样的问题。http://www.google.com在 ff 中打开,而 file:///test.html 在 IE 中打开。

网络浏览器文档说:

请注意,在某些平台上,尝试使用此函数打开文件名可能会起作用并启动操作系统的关联程序。但是,这既不支持也不可移植。

于 2011-05-06T19:57:24.903 回答
1

在 Python 3.6、Windows 10 中对我有用的是使用register()函数 withBackgroundBrowser来登录我想要的浏览器:

import webbrowser

# Register your preferable browser
browser_path = 'C:/path/to/opera.exe'
webbrowser.register('opera', None, webbrowser.BackgroundBrowser(browser_path))

# Get an instance and launch your file
browser = webbrowser.get('opera') 
browser.open('html_file')

额外观察 -

webbrowser 也有一个GenericBrowser类。

查看源代码,似乎在调用时BackgroundBrowser使用,而没有。start_new_sessionsubprocess.Popen()GenericBrowser

我不知道该标志的确切功能。

然而,实际上,使用BackgroundBrowser切换到浏览器窗口,虽然GenericBrowser只是打开选项卡,但不会切换。

于 2019-05-24T20:54:38.210 回答
0

这个问题只出现在我file:///可能没有注册到 chrome 的协议 URL 上,所以 os.startfile() (这是 webbrowser.open 在 Windows 上尝试的第一件事)在 Internet Explorer 中打开它们。我不认为将您的其他浏览器放在 PATH 中会有所帮助,因为 os.startfile() 在尝试路径中的浏览器之前仍然会被调用。

可以做的是检查http://注册表中的默认浏览器(例如,通过检查注册表项HKEY_CLASSES_ROOT\http\shell\open\command)并将该浏览器用于file:///URL。不漂亮,但它应该工作。

import _winreg
import webbrowser
import shlex
import subprocess

def win_browser_open(url):
    if url.startswith('file:///'):
        browser = _winreg.QueryValue(_winreg.HKEY_CLASSES_ROOT, r'http\shell\open\command')
        browser = browser.replace('%1', url)
        subprocess.Popen(shlex.split(browser))
    else:
        webbrowser.open(url)
于 2011-05-06T20:06:11.030 回答
0

用这个:

import webbrowser
webbrowser.get('windows-default').open('http://www.google.com')
于 2020-03-21T23:28:31.397 回答
0

因为所有答案都没有解决这个/我的问题,所以这种方式对我有用......(Windows)

命令需要在列表中,而不是在单个字符串中!(在这种情况下,“start”、“filepath”),shell 也需要为 True(windows)

import subprocess
subprocess.Popen(['start', 'C:/Users/User/Desktop/convert_report.html'], shell=True)
于 2020-08-08T18:57:47.093 回答
0

似乎webbrowser模块在cwd中找不到文件名,因为您通过快捷方式或终端打开程序,因此cwd与程序的目录不同。

webbrowser.open在这种情况下,您必须在为函数提供路径时将路径转换为程序目录的绝对路径。

程序的路径存储为__file__全局常量。

你可以这样修复:

webbrowser.open(os.path.join(__file__, '..', filename))

我通过这个解决方案解决了同样的问题。

于 2021-08-24T16:32:43.183 回答
0

将 BROWSER 变量添加到系统变量并放置默认浏览器的路径。

于 2021-12-13T13:01:42.847 回答