如果被调用的python脚本遇到错误,则退出

时间:2018-02-23 07:14:17

标签: python

我有一个中央python脚本,调用各种其他python脚本,如下所示:

os.system("python " + script1 + args1)
os.system("python " + script2 + args2)
os.system("python " + script3 + args3)

现在,如果任何子脚本遇到错误,我想退出我的中心脚本。

当前代码发生的事情是让script1遇到错误。控制台将显示该错误,然后中央脚本将移至调用script2,依此类推。

我想显示遇到的错误并立即退出我的中心代码。

这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:1)

总的来说,这是从Python中执行一系列命令的可怕方法。然而,这是处理它的最小方法:

#!python
import os, system
for script, args in some_tuple_of_commands:
    exit_code = os.system("python " + script + args)
    if exit_code > 0:
        print("Error %d running 'python %s %s'" % (
            exit_code, script, args), file=sys.stderr)
        sys.exit(exit_code)
但是,说实话,这太可怕了。连接字符串并将它们传递给shell以便在任何编程语言中执行几乎总是一个坏主意。

查看subprocess module,了解Python中更加理智的子进程处理。

另请考虑尝试shpexpect第三方模块,具体取决于您尝试对输入或输出执行的操作。

答案 1 :(得分:0)

您可以尝试子流程

import subprocess,sys

try:
    output = subprocess.check_output("python test.py", shell=True)
    print(output)
except ValueError as e:
    print e
    sys.exit(0)

print("hello world")

答案 2 :(得分:0)

我不知道它是否适合你,但将这些命令包含在函数中对我来说似乎是个好主意:

  

我使用的事实是,当进程退出时出现错误os.system(process)返回256,否则它将分别返回0作为输出。

def runscripts():
    if os.system("python " + script1 + args1):return(-1); #Returns -1 if script1 fails and exits.
    if os.system("python " + script2 + args2):return(-2); #Returns -2 and exits
    if os.system("python " + script3 + args3):return(-3); #Pretty obvious
    return(0)

runscripts()

#or if you want to exit the main program
if runscripts():sys.exit(0)

答案 3 :(得分:0)

调用这样的操作系统是一种等待发生的安全漏洞。应该使用subprocess module,因为它更强大并且不会调用shell(除非您明确指出)。通常,尽可能避免调用shell(see this post)。

你可以这样做:

import subprocess
import sys

# create a list of commands
# each command to subprocess.run must be a list of arguments, e.g.
# ["python", "echo.py", "hello"]
cmds = [("python " + script + " " + args).split()
        for script, args in [(script1, args1), (script2, args2), (script3,
                                                                  args3)]]


def captured_run(arglist):
    """Run a subprocess and return the output and returncode."""
    proc = subprocess.run( # PIPE captures the output
        arglist, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return proc.stdout, proc.stderr, proc.returncode


for cmd in cmds:
    stdout, stderr, rc = captured_run(cmd)
    # do whatever with stdout, stderr (note that they are bytestrings)
    if rc != 0:
        sys.exit(rc)

如果您不关心输出,只需删除subprocess.PIPE内容并仅从函数中返回returncode。您可能还想为执行添加超时,请参阅上面链接的子流程文档以了解如何执行此操作。