如何在子进程中避免shell = True

时间:2018-01-04 17:47:14

标签: python shell subprocess popen

我有子进程命令来检查md5校验和为

subprocess.check_output('md5 Downloads/test.txt', stderr=subprocess.STDOUT, shell=True)

工作正常。 但是我试着避免shell=True 但是当我跑步时

subprocess.check_output('md5 Downloads/test.txt', stderr=subprocess.STDOUT, shell=False)

我收到错误OSError: [Errno 2] No such file or directory

我可以使用shell=False运行上述命令或解决方法,还是可以保留shell=True

2 个答案:

答案 0 :(得分:8)

只需将参数传递给check_output()作为列表

subprocess.check_output(["md5", "Downloads/test.txt"], stderr=subprocess.STDOUT)

来自docs

  所有调用都需要

args ,并且应该是字符串或序列   程序参数。通常提供一系列论证   首选,因为它允许模块处理任何所需的   转义和引用参数(例如,允许文件中的空格   名)。如果传递单个字符串,则 shell 必须为True(请参阅   或者字符串必须简单地命名要执行的程序   没有指定任何参数。

答案 1 :(得分:1)

如果是复杂命令,您可以使用shlex将命令作为列表传递给Check_Output或任何其他子流程类

来自文件

shlex.split()在确定args的正确标记化时非常有用,尤其是在复杂情况下:

https://docs.python.org/3.6/library/subprocess.html#subprocess.check_output

来到上面的例子

import shlex
inp="md5 Downloads/test.txt"
command=shlex.split(inp)
subprocess.check_output(command, stderr=subprocess.STDOUT)