Python3:超出资源限制时的异常或返回代码?

时间:2016-11-16 15:35:03

标签: python python-3.x subprocess exit-code

我正在运行python 3.4.3。我有一个可能运行很长时间的子进程,或生成太大的文件。我有这个代码。

def setlimits():
    if DEBUG:
        print("Setting resource limit in child (pid {0})".format(os.getpid()))
    resource.setrlimit(resource.RLIMIT_CPU, (.05, .05))  # CPU time in secs
    resource.setrlimit(resource.RLIMIT_FSIZE, (1000000, 1000000)) # file size
    resource.setrlimit(resource.RLIMIT_NOFILE, (20, 20)) # Number open files

然后我用这段代码调用子进程(在一个更大的例程中)。

        rc = None
        try:
            rc = subprocess.call(["potentially long-running command"],shell=True, preexec_fn=setlimits) 
        except Exception as err:
            print("Exception happened")
            rc = -1
        print("rc = {0}".format(str(rc)))

当我为它提供一个运行时间长的过程时,它不会给我一个例外。 (我根据资源文档预计OSError。)它给了我一个rc = 137。

知道记录在哪里吗?我当然想知道我已经涵盖了所有案件;我需要if rc>128 - 类型检查吗?

1 个答案:

答案 0 :(得分:3)

137是reserved exit code,表示该过程被终止 - 它等于128 + 9(其中9代表信号9或SIGKILL)。这很可能发生在进程达到其硬CPU限制并被内核杀死时。

如果被调用进程返回非零退出状态,则

subprocess.call()不会引发异常。如果您想要这种行为,那么您最好使用subprocess.check_call()subprocess.run(..., check=True),这会在非零退出状态下提升CalledProcessError