使用 Python 打开网页时如何覆盖 Windows 7 中的默认浏览器选择

How to override the default browser selection in Windows 7 when opening webppages with Python

我有一个在 Windows 上用 Python 3.7.4 编写的程序,可以在浏览器中打开网页。它显示默认浏览器,并让用户有机会更改他们想要用来打开程序的浏览器。

使用 :

初始化程序时检测到默认浏览器
from winreg import HKEY_CURRENT_USER, OpenKey, QueryValueEx

import webbroswer

reg_path = r'Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice'
chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'
firefox_path = 'C:/Program Files (x86)/Mozilla Firefox/firefox.exe %s'

with OpenKey(HKEY_CURRENT_USER, reg_path) as key:
    print(QueryValueEx(key, 'ProgId'))
    thedefaultbrowser = (QueryValueEx(key, 'ProgId'))
    thedefaultbrowser = (thedefaultbrowser[0])
    thedefaultbrowser = (thedefaultbrowser[0:2])
    if thedefaultbrowser == "Fi":
        browser_path = firefox_path
    if thedefaultbrowser == "Ch":
        browser_path = chrome_path

和 links 是这样打开的,作为程序稍后发生的无限循环的一部分:

while True:

    # [lots of GUI code that isn't relevant]

    event = input()

    if event == 'pleasegetmealinknao':
        x=open("C:/folder/atextfilewithalinkinit.txt", "r")
        the_url1 = x.read()
        webbrowser.get(browser_path).open(the_url1)
        x.close()     

在同一个循环中,可以接受用户输入以更改浏览器类型:

    elif event == "Firefox":
        browser_path = firefox_path
        continue
    elif event == "Chrome":
        browser_path = chrome_path
        continue       

这样我就可以打开一个网页了。然后我可以很好地更改浏览器类型,然后在新用户选择的浏览器中打开另一个网页,但是 - 仅在 Windows 10.

在Windows7中,Firefox配合得很好,Chrome也是如此,但是只有在程序运行前将Chrome设置为默认浏览器。但是,如果在程序启动前将 Firefox 设置为默认浏览器,一旦我 切换到 Chrome 然后尝试在 Chrome 中打开任何内容,程序变得非常沮丧并停止 运行。没有崩溃,没有错误消息或回溯,它只是完全冻结并且需要硬重启。有时我可以通过关闭刚刚打开的新浏览器 window 将程序从冻结状态中解救出来,但这当然会破坏程序的目的。

但是 - 如果我放弃所有这些花哨的业务而只接受默认浏览器是什么,就像这样:

    if event == 'pleasegetmealinknao':
        x=open("C:/folder/atextfilewithalinkinit.txt", "r")
        the_url1 = x.read()
        webbrowser.open(the_url1)
        x.close()  

然后选择的 link 将在任何系统默认浏览器中愉快地打开,无论是 Firefox、Chrome、Internet Explorer 还是其他任何浏览器。

那么为什么会发生这种情况,我该如何解决?还是我只能放弃我对可选浏览器的梦想?

我的猜测是,这可能与 Chrome 检测到它不是默认浏览器并要求用户更改默认浏览器设置有关,这是有道理的。然而问题是,如何让 Python 程序忽略这种行为。与此相关的弹出窗口并不总是出现。

编辑:进一步测试,有时 Windows 7 行为模式也发生在 Windows 10 中......但似乎并非所有时间。这让我更加认为它与浏览器相关,而不是严格的 OS 相关,并且与 Chrome 要求默认状态有很大关系,但我仍然没有接近解决该做什么关于它。

您试过网络浏览器模块了吗?

import webbrowser
webbrowser.get('firefox %s').open('http://google.com')

您可以在此处查看浏览器列表及其名称webbrowser docs

如果我没猜错你想在你想要的浏览器而不是默认浏览器中打开一个选项卡 在这种情况下,您可以使用 webbrowser

中的 get 方法

对我有用的简单代码是:

import webbrowser as wb

wb.get('google-chrome') #the return answer was : <webbrowser.Chrome object at 0x7fe787065a50>

wb.get('google-chrome').open('https://url')

Here is the list for the supported browsers:

我无法测试这个问题,因为我没有 Windows 7. 如果问题是 Chrome 正在检查它是否是默认浏览器,您可以通过命令行开关抑制它chrome.exe --no-default-browser-check $link。但是,我认为您不能使用 python webbrowser 模块来执行此操作。相反,您需要使用子进程或与 windows 兼容的终端交互模块,例如:pbs,然后通过终端调用网络浏览器。 https://pypi.org/project/pbs/