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 中的错误还是我配置错误?
我正在使用:
- Linux曼扎罗
- Python 3.7.0 安装了 pyenv (
env PYTHON_CONFIGURE_OPTS="--enable-shared --enable-optimizations" pyenv install 3.7.0
)
- Opera 是我的默认浏览器
webbrowser.get()
returns <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反映了这一点。
当我运行
import webbrowser
webbrowser.open('https://google.com')
在 Python 3.7 中,它在我的默认浏览器中打开 url:http://openurl%28https//google.com,new-window)
。当我 运行 3.6 中的相同代码时,它可以正常工作。这是 Python 3.7 中的错误还是我配置错误?
我正在使用:
- Linux曼扎罗
- Python 3.7.0 安装了 pyenv (
env PYTHON_CONFIGURE_OPTS="--enable-shared --enable-optimizations" pyenv install 3.7.0
) - Opera 是我的默认浏览器
webbrowser.get()
returns<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.
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反映了这一点。