我想检查Python的子进程是否成功或是否发生错误

时间:2017-12-29 17:01:26

标签: python subprocess

我正在尝试使用python子进程创建代码生成代码。

#code = 'print("hey")' #OK
code = 'print"hey")'   #SyntaxError
with open(filename, 'w') as f:
    f.write(code)

proc = s.Popen(['python',filename], stdout=s.PIPE, stderr=s.STDOUT)
stdout_v, stderr_v = proc.communicate('')
print(stdout_v.decode('utf8'))

大致是这样的。

目前,子进程的返回值包含在stdout_v中,即使它正常运行或发生语法错误,也无法区分它们。

如果输出正常,是否可以接收输出,如果发生错误,可以从子进程收到错误消息?

2 个答案:

答案 0 :(得分:4)

在Python 3.5+中使用子进程的推荐方法是使用run function

proc = s.run(['python',filename], stdout=s.PIPE, stderr=s.PIPE, check=False)
stdout_v, stderr_v, = proc.stdout, proc.stderr
return_code = proc.return_code

如果返回码非零(表示发生了某些错误),请设置check=True以抛出错误。

在旧版本的Python中,我通常更喜欢使用check_outputcall函数。如果检测到非零退出代码,Check_output将抛出错误,而调用函数将继续正常。

答案 1 :(得分:0)

来自文件

https://docs.python.org/2/library/subprocess.html

您可以通过

检查命令的有效性
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

使用参数运行命令。等待命令完成。如果返回码为零则返回,否则引发CalledProcessError。 CalledProcessError对象将在returncode属性中包含返回代码。

Return code 0= Sucess

如果您希望查看命令的输出

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

使用参数运行命令并将其输出作为字节字符串返回。