1

我有以下代码:

    argpass = ['nohup']
    argpass.append('/path/to/script')

    log_output_err = open(log_file,'a+')
    out = subprocess.Popen(argpass,
                       stdout = log_output_err,
                       stderr = log_output_err)

    #if the script fails I need to have some logic here...

我只是想知道如何获得 /path/to/script 的返回码。

也许我只需要在 /path/to/script 中插入逻辑,有什么想法吗?

谢谢,

4

1 回答 1

4

subprocess.Popen对象具有returncode您可以访问的属性:

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.returncode

您还可以查看使用check_call便利功能:

http://docs.python.org/2/library/subprocess.html#subprocess.check_call

只有返回码为零时才会返回;否则,它将引发一个CalledProcessError(您可以从中读取returncode属性)。

您的示例,stdout 和 stderr 指向调用 Python 脚本而不是日志文件:

>>> import subprocess
>>> argpass = ['echo']
>>> argpass.append('hello world')
>>> # I reroute to PIPE because I don't have a logfile
>>> log_output_err = subprocess.PIPE 
>>> out = subprocess.Popen(argpass,
               stdout = log_output_err,
               stderr = log_output_err)
>>> output,error = out.communicate()
>>> print output
hello world

>>> # Check if child process has terminated. 
>>> # If it has finished, will return returncode attribute.
>>> # Otherwise, it returns None
>>> out.poll()
0
>>> # Or we can read the returncode attribute directly:
>>> out.returncode # Direct
0
>>> 

如果您的过程需要很长时间才能完成,那么returncode您去检查它时可能没有设置该值。如果值returncode是,则None意味着您的子进程尚未终止。您可以停止执行脚本,直到子进程使用该.wait()方法终止。

于 2013-09-24T18:32:56.797 回答