【问题标题】:how to avoid shell=True in subprocess如何在子进程中避免 shell=True
【发布时间】:2018-06-14 12:16:30
【问题描述】:

我有子进程命令来检查 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 可以吗?

【问题讨论】:

标签: python shell subprocess popen


【解决方案1】:

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

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

来自docs

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

【讨论】:

    【解决方案2】:

    在复杂命令的情况下,您可以使用 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)
    

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多