我正在尝试使用“ 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
无法得到结果吗?
答案 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)