python的webbrowser在Windows 7上启动IE而不是默认

时间:2011-05-06 19:43:50

标签: python browser

我正在尝试在默认浏览器中从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可能就是答案。

11 个答案:

答案 0 :(得分:22)

我的主要问题是尝试将file://添加到相对路径时出现错误的网址。可以用以下方法解决:

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

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

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

GenericBrowserBackgroundBrowser都会使用exe成员调用subprocess.Popen(),即使网址错误也会成功,并返回True。 IE没有提供任何问题的迹象,所有其他浏览器都有一条很好的消息说他们找不到该文件。

  1. GenericBrowser由环境变量BROWSER设置,并且是第一个。
  2. WindowsDefault排名第二。
  3. BackgroundBrowser是最后一个,如果其他方法无效,则包含后备IE。
  4. 这是我原来的设置:

    >>> 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。

webbrowser doc说:

  

请注意,在某些平台上,尝试   使用此函数打开文件名,   可以工作并开始运作   系统的相关程序。然而,   这既不支持也不支持   便携式的。

答案 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')