我正在尝试将铬打开到具有特定启动参数的授权URL。我无法使用webbrowser库找到此启动参数的解决方案,因此转到os.system
browser_cmd = "chromium-browser --password-store=basic " + auth_url
os.system(browser_cmd)
直到URL中的“&”为止。因此,打开Chrome时不会打扰到我的废话,但只会打开URL,直到第一个&。有没有一种方法可以处理URL并保持其完整性?
答案 0 :(得分:1)
这是因为&
对于shell来说是特殊的。在Python 3中运行子流程的典型方法是:
import subprocess
subprocess.run(['chromium-browser', '--password-store=basic', auth_url],
check=True)
print('chromium-browser exited successfully')
答案 1 :(得分:0)
这就是为什么您不应该将os.system
用于不重要的事情的原因。正如该功能的the docs所说:
subprocess
模块提供了更强大的功能来生成新流程并检索其结果;使用该模块优于使用此功能。有关一些有用的食谱,请参见Replacing Older Functions with thesubprocess
Module文档中的subprocess
部分。
如果您点击该链接,将会看到可以这样写:
subprocess.call(['chromium-browser', '--password-store=basic', auth_url])
因为您要传递一个参数列表,而不是试图将它们放在一起就可以通过外壳走私到字符串中,所以您不必担心引用或其他问题。
顺便说一句,您可能想在这里使用run
而不是call
,但是由于某些原因,从3.7开始,文档中的食谱仍未更新,我没有希望通过显示不匹配的内容来增加困惑……无论如何,您至少应该阅读文档顶部的快速入门“使用”部分。
如果出于某种原因确实要使用os.system
,则需要引用和/或转义auth_url
参数。假设您不关心Windows,最好的方法是使用shlex
模块:
browser_cmd = "chromium-browser --password-store=basic " + shlex.quote(auth_url)
os.system(browser_cmd)
如果您关心Windows,则可以将posix=False
添加到quote
调用中。 posix
标志的作用记录在shlex
constructor下。默认的True
值意味着它尽可能地遵循POSIX规则,这意味着只要您的外壳与sh
严格兼容(例如,例如bash
,但Windows cmd
绝对不是,甚至tcsh
或fish
也可能不是)。对于False
,它使用“兼容模式”。对于像您这样的简单示例,它应该适用于大多数shell,而无需摆弄,但是如果您变得更复杂,则需要阅读Improved Compatibility with Shells。 (而且,对于Windows cmd
或PowerShell
,您可以将内容推送多远。)