Python URL中断系统命令

时间:2018-07-16 18:57:24

标签: python os.system

我正在尝试将铬打开到具有特定启动参数的授权URL。我无法使用webbrowser库找到此启动参数的解决方案,因此转到os.system

browser_cmd = "chromium-browser --password-store=basic " + auth_url
os.system(browser_cmd)

直到URL中的“&”为止。因此,打开Chrome时不会打扰到我的废话,但只会打开URL,直到第一个&。有没有一种方法可以处理URL并保持其完整性?

2 个答案:

答案 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 the subprocess 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绝对不是,甚至tcshfish也可能不是)。对于False,它使用“兼容模式”。对于像您这样的简单示例,它应该适用于大多数shell,而无需摆弄,但是如果您变得更复杂,则需要阅读Improved Compatibility with Shells。 (而且,对于Windows cmdPowerShell,您可以将内容推送多远。)