webbrowser.open() 打破了 link (python 3.7)

webbrowser.open() breaks the link (python 3.7)

当我运行

import webbrowser
webbrowser.open('https://google.com')

在 Python 3.7 中,它在我的默认浏览器中打开 url:http://openurl%28https//google.com,new-window)。当我 运行 3.6 中的相同代码时,它可以正常工作。这是 Python 3.7 中的错误还是我配置错误?

我正在使用:

编辑This issue固定在Python一侧。在 Python 的下一个次要版本之后,您不需要考虑这个问题。不过下面的回答还是很有用的分析。


在 Python3.6 中,webbrowser.get() 会给你这样的东西:

<webbrowser.BackgroundBrowser object at 0x7f1e5373a048>

但在 Python3.7:

<webbrowser.Opera object at 0x7f546c22ea90>.

这意味着在 Python3.6 中它将尝试使用 XDG 标准打开 URL:

xdg-open https://google.com

而在 Python3.7 中它将直接使用 its CLI command:

打开 Opera 浏览器

opera -remote "openURL(https://google.com,new-window)"

虽然我不确定此更改是否有意为之,但这两种方式都应该是正确的。问题是,Opera 的命令行选项已损坏。这不是 Python 的错,这是 Opera 的错误。 (尝试使用上面的命令打开,你会看到相同的 http://openurl%28https//google.com,new-window)。)

作为解决方法,您可以使用 register() with the new preferred argument introduced in 3.7.

通过 XDG 标准强制打开 URL
import webbrowser
webbrowser.register("xdg-open", None, webbrowser.BackgroundBrowser("xdg-open"), preferred=True)
print(webbrowser.get())  # Now you will see <webbrowser.BackgroundBrowser object at 0x7f1e5373a048>
webbrowser.open('https://google.com')

希望对您有所帮助!

编辑: 看来 Opera 的错误是因为他们在将引擎更改为 Chromium 后没有更新文档。 Opera 可以很好地处理 Chrom 的 CLI 参数。我issued a change to Python反映了这一点。