我有子进程命令来检查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
?
答案 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)