Python:chrome.exe 的通用 webbrowser.get().open() 不起作用

Posted

技术标签:

【中文标题】Python:chrome.exe 的通用 webbrowser.get().open() 不起作用【英文标题】:Python: generic webbrowser.get().open() for chrome.exe does not work 【发布时间】:2014-09-12 10:37:28 【问题描述】:

我使用的是 Python 2.7 (Win 8.1 x64),我想在 Chrome 中打开一个 URL。 由于 Chrome 仅在 3.3+ 中受原生支持,因此我尝试了一个通用调用:

import webbrowser
webbrowser.get("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe %s").open("http://google.com")

路径正确,打印确实给了我一个处理程序:

"<webbrowser.GenericBrowser object at 0x0000000002D26518\>"

但是,open() - 最好是 open_new_tab()) - 函数不起作用。它返回 False。

如果我运行命令

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://google.com"

在 Windows 运行对话框中,它确实可以工作。


如果我将 Chrome 设置为标准浏览器并运行

webbrowser.get().open("http://google.com")

它确实有效,但这不是我想要的。

有人知道出了什么问题吗?

【问题讨论】:

当你import subprocess; subprocess.Popen([r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe', 'https://google.com']).wait()时会发生什么? @MartijnPieters:这确实有效。 :-) 是的,dano 解释了哪里出了问题;我没有意识到 shlex 在 Windows 上会做错事。 【参考方案1】:

您必须在 webbrowser.get 调用中使用 unix 样式的路径:

webbrowser.get("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s").open("http://google.com")

这是因为webbrowser 内部在路径上做了一个shlex.split,它只会删除 Windows 样式的路径分隔符:

>>> cmd = "C:\\Users\\oreild1\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe %s"
>>> shlex.split(cmd)
['C:Usersoreild1AppDataLocalGoogleChromeApplicationchrome.exe', '%s']
>>> cmd = "C:/Users/dan/AppData/Local/Google/Chrome/Application/chrome.exe %
s"
>>> shlex.split(cmd)
['C:/Users/dan/AppData/Local/Google/Chrome/Application/chrome.exe', '%s']

shlex 如果给定 posix=False 关键字参数,实际上会在这里做正确的事情,但 webbrowser 不会提供,即使在 Windows 上也是如此。这可以说是webbrowser 中的一个错误。

【讨论】:

听起来像是需要向Python bug tracker报告的事情;我找不到任何预先存在的问题。 @MartijnPieters 我正在申请一个:) 谢谢,@dano:Issue22025 - webbrowser.get(command_line) does not support Windows-style path separators python 3.6 windows7:对我不起作用(URL 在默认浏览器中打开)【参考方案2】:

按照上面的建议并在 Windows 上工作,为了启用 Firefox,我在配置文件中更改(并取消注释)以下行(注意末尾的 %s):

c.NotebookApp.browser = 'C:/Program Files (x86)/Mozilla Firefox/firefox.exe %s'

这对我有用。 谢谢

【讨论】:

你的意思是什么配置文件?【参考方案3】:

您无需切换到 Unix 风格的路径——只需引用可执行文件即可。

import webbrowser
webbrowser.get('"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" %s').open('http://google.com')

【讨论】:

【参考方案4】:

为我工作

代码sn-p:

import webbrowser

chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'
webbrowser.get(chrome_path).open('http://google.com')

【讨论】:

【参考方案5】:

在 Windows 上,您不需要使用 UNIX 样式的路径。只需将google.exe 的原始字符串路径用转义引号括起来,然后在f-string 中附加%s 标记:

import webbrowser

url = "https://docs.python.org/3/library/webbrowser.html"
chrome = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
webbrowser.get(f"\"chrome\" %s").open_new_tab(url)

【讨论】:

【参考方案6】:

你可以试试这个:

import webbrowser

chrome_path = "path_where_chrome_is_located"
webbrowser.register('chrome', None, webbrowser.BackgroundBrowser(chrome_path))

webbrowser.get('chrome').open('url')

【讨论】:

感谢您的回答,但在当前状态下,它的格式不是很好。此外,查看问题和接受的答案,提问者遇到的实际问题是 chrome 路径本身,您的答案目前没有解决。

以上是关于Python:chrome.exe 的通用 webbrowser.get().open() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置chrome浏览器可以跨域

Chrome 49 plus --disable-web-security

如何解决ajax在google chrome浏览器上失效

浏览器安全 - Chrome浏览器

python打开浏览器的三种方法

chrome最新版49跨域问题