在子流程运行正常的情况下,check_output在python 3.6中不起作用

时间:2018-10-12 15:54:35

标签: python subprocess centos7

我正在尝试使用“ check_output”方法获取我的python程序中命令的输出。但出现此错误:

   out = check_output(command5 , shell=True)

文件“ /usr/lib64/python3.6/subprocess.py”,行336,在check_output中     ** kwargs).stdout   运行中的文件“ /usr/lib64/python3.6/subprocess.py”,第418行     输出=标准输出,标准错误=标准错误) subprocess.CalledProcessError:命令'oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_rht-ccp --results-arf arf.xml /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml'返回非-零退出状态2。

这是我程序中与之相关的部分:

command4 = "oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_rht-ccp --results-arf arf.xml /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml"
out = check_output(command4 , shell=True)

我确定命令是正确的,因为我在编写时会得到结果:

subprocess.call(command5,shell=True)

我正在使用python 3.6,并在centos 7中工作。

知道为什么check_output无法得到结果吗?

1 个答案:

答案 0 :(得分:1)

这完全正常,因为您运行的命令生成了非零的退出代码。这意味着您运行的命令表明存在某些问题。

请参见subprocess.check_output() documentation

  

如果返回码非零,则会引发CalledProcessError。

  

这等效于:

run(..., check=True, stdout=PIPE).stdout

check=True不是run()的情况下,return_value标志告诉0引发异常:

  

如果check为true,并且进程以非零退出代码退出,则将引发CalledProcessError异常。

您使用的另一个功能subprocess.call()未设置check=True

  

运行args描述的命令。等待命令完成,然后返回returncode属性。

     

这等效于:

run(...).returncode

因此请勿使用check_output(),或者捕获抛出的异常,或者修复您正在运行的命令。 call()的工作并不表示进程实际上产生了成功的结果。

例如,您可以直接使用subprocess.run()

proc = subprocess.run(
    command5, shell=True, text=True
    stdout=subprocess.PIPE, stderr=subprococess.PIPE)
if proc.returncode:
    print(f'Issue reported, exit code {proc.returncode}, stderr:')
    print(proc.stderr)
else:
   print(proc.stdout)