子流程中的子流程。错误时如何传播输出?

时间:2019-05-20 11:00:38

标签: python subprocess

我使用子流程来运行脚本。但是那个被称为脚本的脚本本身使用子进程来执行一些命令。问题是,当我在外部脚本中捕获异常时,它只是说被调用的脚本中有错误。

所以,我的问题是如何将错误从内部脚本传播到外部脚本,以便我知道内部脚本中发生的确切原因。

这是我通过子进程捕获异常并在错误时退出的方式。

try:
    output = subprocess.check_output(cmd)
except Exception as e:
    print(str(e))
    sys.exit(1)

1 个答案:

答案 0 :(得分:1)

如果使用subprocess python模块,则可以分别处理STDOUT,STDERR和命令的返回代码。您可以看到完整的命令调用程序实现的示例。当然,您可以根据需要使用try..except对其进行扩展。

下面的函数返回STDOUT,STDERR和Return代码,以便您可以在其他脚本中处理它们。

import subprocess

def command_caller(command=None)
    sp = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=False)
    out, err = sp.communicate()
    if sp.returncode:
        print(
            "Return code: %(ret_code)s Error message: %(err_msg)s"
            % {"ret_code": sp.returncode, "err_msg": err}
            )
        # You can raise an error if the return code of command is not zero.
        # raise Exception(
        #   "Return code: %(ret_code)s Error message: %(err_msg)s"
        #   % {"ret_code": sp.returncode, "err_msg": err}
        #   )
    return sp.returncode, out, err