2 回答
TA贡献1820条经验 获得超10个赞
自己手动拆分命令行可以显着简化整个问题。
subprocess.run(['pkill', 'Web Content'], check=True)
如果您确实需要 Python 来执行拆分,shlex.split()
请实现您假设 Python 常规split
函数将遵守的规则。事实并非如此;它只是在您提供的字符串上拆分,不支持转义等。
TA贡献1825条经验 获得超4个赞
您有 2 个选择:
使用subprocess.call("pkill 'Web Content'", shell=True)
或
subprocess.call(shlex.split("pkill 'Web Content'"))
选项1
来自文档:
在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。如果 args 是字符串,则该字符串指定要通过 shell 执行的命令。这意味着字符串的格式必须与在 shell 提示符下键入时完全相同。
split()
将 Python 字符串拆分为空格:
>>> "pkill 'Web Content'".split() ['pkill', "'Web", "Content'"]
因此,为:subprocess.call("pkill 'Web Content'".split())
提供了两个参数,而它只需要一个参数。这就是错误弹出的原因。pkill
"'Web"
"Content'"
pkill: only one pattern can be provided
请注意等同于的subprocess.call
签名subprocess.Popen
:
subprocess.Popen(args,..
来自文档:
args 应该是程序参数的序列,或者是单个字符串或类似路径的对象。默认情况下,如果 args 是一个序列,则要执行的程序是 args 中的第一项。
使用时还要注意安全注意事项shell=True
选项2
如果您想提供 args 序列,请使用shlex.split
:
>>> s = "pkill 'Web Content'" >>> import shlex >>> args = shlex.split(s) >>> import subprocess >>> subprocess.call(args)
shlex.split
将使用类似 shell 的语法分割字符串。s
使用哪个选项取决于您:
了解 shell=True 与 shell=False 使用 shell=True 将单个字符串传递给 shell,shell 从那里获取它。
使用 shell=False 可以绕过 shell 将参数列表传递给操作系统。
当您没有 shell 时,您可以保存进程并消除相当大量的隐藏复杂性,这可能会或可能不会隐藏错误甚至安全问题。
另一方面,当您没有 shell 时,您就没有重定向、通配符扩展、作业控制和大量其他 shell 功能。
添加回答
举报