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

Chu*_*lus 6 python python-3.x python-webbrowser

我有一个在 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
Run Code Online (Sandbox Code Playgroud)

链接是这样打开的,作为程序后面发生的无限循环的一部分:

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()     
Run Code Online (Sandbox Code Playgroud)

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

    elif event == "Firefox":
        browser_path = firefox_path
        continue
    elif event == "Chrome":
        browser_path = chrome_path
        continue       
Run Code Online (Sandbox Code Playgroud)

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

在 Windows 7 中,Firefox 可以很好地协作,Chrome 也是如此,但前提是在程序运行之前将 Chrome 设置为默认浏览器。但是,如果在程序启动之前将 Firefox 设置为默认浏览器,则一旦我切换到 Chrome,然后尝试在 Chrome 中打开任何内容,程序就会变得非常烦躁并停止运行。没有崩溃,没有错误消息或回溯,它只是完全冻结,需要硬重启。有时我可以通过关闭刚刚打开的新浏览器窗口来将程序从冻结状态中解救出来,但这当然违背了程序的目的。

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

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

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

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

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

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

Soh*_*b T 1

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