当我运行时
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
- Python 3.7.0 安装了 pyenv (
env PYTHON_CONFIGURE_OPTS="--enable-shared --enable-optimizations" pyenv install 3.7.0) - Opera 是我的默认浏览器
-
webbrowser.get()返回<webbrowser.Opera object at 0x7f546c22ea90> - 我的os.environ dump
请您参考如下方法:
编辑: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反射(reflect)这一点。
