【问题标题】:python subprocess check_outputpython子进程check_output
【发布时间】:2017-08-19 14:28:53
【问题描述】:

我尝试使用 python 子进程执行以下命令,但它失败了。

请帮忙

  import subprocess
  cmd = "bash /opt/health_check -t 2>/dev/null"
  retcode = subprocess.call([cmd])
  print retcode

我得到以下输出:

Traceback (most recent call last):
  File "./script.py", line 65, in <module>
    retcode = subprocess.call([cmd])
  File "/usr/lib64/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

【问题讨论】:

    标签: python python-2.7 subprocess


    【解决方案1】:

    如果您使用 list 调用 check_output,则需要自己标记命令,如下所示:

    import subprocess
    cmd = ["bash", "/opt/health_check", "-t"]
    retcode = subprocess.call([cmd])
    print retcode
    

    这不使用外壳,因此您不能使用输入重定向。如果你真的想用 shell 执行你的命令,那么传递一个 string 并设置 shell=True:

    import subprocess
    cmd = "bash /opt/health_check -t 2>/dev/null"
    retcode = subprocess.call(cmd, shell=True)
    print retcode
    

    【讨论】:

    • 或者先从列表开始,或者先尝试在字符串上使用shlex.split()...
    【解决方案2】:

    这是调用subprocess 的错误方式。一种快速而肮脏的方法是将其更改为:

    subprocess.call(cmd, shell=True)
    

    这将调用系统的 shell 来执行命令,您将可以访问它提供的所有好东西。但是,它不能轻而易举地使用,所以在这样做之前请查看文档中的security considerations

    否则,您可以简单地将命令作为列表提供,如下所示:

    subprocess.call(["bash", "/opt/health_check"])
    

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 2018-02-21
      • 2019-05-30
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多