我正在尝试在默认浏览器中从python启动本地html文件。现在我的默认值是谷歌浏览器。如果我双击.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上。为什么镀铬没有启动?
更新:代码将在未知的操作系统和计算机上运行,因此注册浏览器或路径更新不是选项。我认为解析file://
的网址,然后进行os.path.exists
检查和os.path.realpath
可能就是答案。
答案 0 :(得分:22)
我的主要问题是尝试将file://
添加到相对路径时出现错误的网址。可以用以下方法解决:
webbrowser.open('file://' + os.path.realpath(filename))
使用webbrowser.open
将尝试多种方法,直到一个“成功”,这是一个松散的定义。
WindowsDefault
类调用os.startfile()
失败并返回False
。我可以通过在windows run命令中输入URL并查看错误消息而不是浏览器来验证这一点。
GenericBrowser
和BackgroundBrowser
都会使用exe成员调用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 env var或修改我的路径都可以让我得到正确的浏览器,并提供更好的错误信息。
感谢帮助人员,如果没有您的想法,我无法解决这个问题。
答案 1 :(得分:14)
您可以使用get(name)
来使用特定的浏览器。
You'll need to register the Chrome webbrowser,因为它似乎不是predefined browser types之一,然后您应该可以这样做:
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的预定义默认值。
答案 2 :(得分:7)
这为我打开了一个新的Chrome标签,它仍然与操作系统无关:
webbrowser.get().open('http://www.google.com')
奇怪的是,没有get()
调用,它仍然使用IE。这看起来像一个简单的解决方法的错误。
答案 3 :(得分:2)
webbrowser
模块应该使用默认浏览器,因此这可能是一个错误。另一方面,请使用docs中的此解释来解决您的问题:
如果环境变量为BROWSER 存在,它被解释为覆盖 平台默认的浏览器列表, 作为os.pathsep分隔的列表 浏览器按顺序尝试。当。。。的时候 列表部分的值包含 字符串%s,然后它被解释为a 文字浏览器命令行 与替换的参数URL一起使用 为%s;如果零件不包含 %s,它被简单地解释为 要启动的浏览器的名称。
答案 4 :(得分:1)
查看module source code,它首先尝试使用Windows默认浏览器,但如果它不起作用,它会搜索作为命令的常见浏览器名称,即。在PATH变量中。尝试将您的Web浏览器的位置添加到PATH。
答案 5 :(得分:1)
我和firefox有同样的问题。在ff中打开http://www.google.com,而在IE中打开file:///test.html。
请注意,在某些平台上,尝试 使用此函数打开文件名, 可以工作并开始运作 系统的相关程序。然而, 这既不支持也不支持 便携式的。
答案 6 :(得分:1)
简而言之,使用Windows 10,所有不包含https://example.com
格式的完整网址的内容都会在IE中为我打开。例如,如果我说
webbrowser.open("https://www.example.com")
它会在Chrome中打开一个新标签,而
webbrowser.open("example.com")
将打开IE。任何.get()
都会导致它根本无法打开浏览器。
有点奇怪的行为,但我可以看到这是一个复杂的事情,并且很可能操作系统应该归咎于这种行为。
答案 7 :(得分:1)
由于所有答案都不能解决这个/我的问题,因此这种方式对我有用...(Windows)
命令需要在列表中,而不是在单个字符串中! (在这种情况下,为“开始”,“文件路径”),外壳程序也必须为True(Windows)
if($product){
$newQty = $request->quantity + $product->pivot->quantity;
$product->pivot->quantity = $newQty;
$product->pivot->save();
return redirect()->back();
}
答案 8 :(得分:0)
此问题仅适用于file:///
协议URL,可能未注册到chrome,因此os.startfile()(这是webbrowser.open在Windows上尝试的第一件事)在Internet Explorer中打开它们。我不认为将其他浏览器放在PATH中会有所帮助,因为在尝试路径中的浏览器之前仍然会调用os.startfile()。
您可以做的是检查注册表中http://
的默认浏览器(例如,通过检查注册表项HKEY_CLASSES_ROOT\http\shell\open\command
)并将其用于file:///
个网址。不漂亮,但它应该工作。
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)
答案 9 :(得分:0)
在Python 3.6 Windows 10上对我有用的是将register()
函数与BackgroundBrowser
结合使用,以登录所需的浏览器:
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
类。
看着source,似乎BackgroundBrowser
在呼叫start_new_session
时使用subprocess.Popen()
,而GenericBrowser
却没有。
我不知道该标志的确切功能。
实际上,使用BackgroundBrowser
会切换到浏览器窗口,而GenericBrowser
只是打开选项卡,但不会切换。
答案 10 :(得分:0)
使用此:
import webbrowser
webbrowser.get('windows-default').open('http://www.google.com')