2

当我跑

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

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

我正在使用:

  • Linux Manjaro
  • 使用 pyenv ( env PYTHON_CONFIGURE_OPTS="--enable-shared --enable-optimizations" pyenv install 3.7.0)安装的 Python 3.7.0
  • Opera 是我的默认浏览器
  • webbrowser.get()返回<webbrowser.Opera object at 0x7f546c22ea90>
  • 我的操作系统环境转储
4

1 回答 1

4

编辑此问题已在 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 中,它将直接使用其 CLI 命令打开 Opera 浏览器:

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

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

作为解决方法,您可以通过 XDG 标准强制打开 URL,使用3.7 中引入register()的新preferred参数。

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 参数配合得很好。我对 Python 进行了更改以反映这一点。

于 2018-07-02T01:25:26.957 回答