如果我调用与过程subprocess.Popen
在Python如下:
myproc = subprocess.Popen(...).communicate()
什么是看其状态的正确方法是什么? 不是它输出到标准输出或标准错误,但它的退出状态,一旦它的完成(如0成功或其他故障)?
如果我调用与过程subprocess.Popen
在Python如下:
myproc = subprocess.Popen(...).communicate()
什么是看其状态的正确方法是什么? 不是它输出到标准输出或标准错误,但它的退出状态,一旦它的完成(如0成功或其他故障)?
returncode
是确实的答案,但解决方案并不需要很复杂。
process = subprocess.Popen(...)
stdoutdata, stderrdata = process.communicate()
print process.returncode
在更多信息Python的subprocess
文档 。
直到它完成执行的过程没有返回代码。 因此,如果还没有完成,你必须决定你想要做什么:等待它,或者返回的一些指标“我还没说完呢。”
如果你想等,使用communicate
然后检查returncode
属性。
如果您想查询返回的代码是否被设置,并返回None
如果没有,用Popen.poll()
Popen.poll()
检查子进程已经终止。 设置并返回返回码属性。
(如果过程没有终止, poll()
返回None
)
您可能需要调用一个wait
你的子,然后(一旦完成)签入状态returncode
的子实例的领域。
我有一个小程序调用的东西,也许它会帮助...
def singleProcessExecuter(command, ** kwargs):
assert isinstance(command, list), "Expected 'command' parameter to be a list containing the process/arguments to execute. Got %s of type %s instead" % (command, type(command))
assert len(command) > 0, "Received empty list of parameters"
retval = {
"exitCode": -1,
"stderr": u"",
"stdout": u"",
"execTime": datetime.timedelta(0),
"command": None,
"pid": None
}
retval["command"] = command
log.info("::singleProcessExecuter > At %s, executing \"%s\"" % (datetime.datetime.now(), " ".join(command)))
#print("::singleProcessExecuter > At %s, executing \"%s\"" % (datetime.datetime.now(), " ".join(parameter)))
cwd = kwargs.get("cwd", os.getcwd())
user = kwargs.get("user", getUid())
sheel = kwargs.get("shell", False)
startDatetime = datetime.datetime.now()
myPopy = subprocess.Popen(command, cwd=cwd, preexec_fn=os.seteuid(getUid(user)), shell=sheel, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
retval["pid"] = myPopy.pid
log.debug("::singleProcessExecuter > Command \"%s\" got pid %s" % (" ".join(command), myPopy.pid))
try:
retval["stdout"], retval["stderr"] = myPopy.communicate()
myPopy.wait()
except OSError, osErr:
log.debug("::singleProcessExecuter > Got %s %s in myPopy.communicate() when trying get output of command %s. It is probably a bug (more info: http://bugs.python.org/issue1731717)" % (osErr, type(osErr), command[0]))
except Exception, e:
log.warn("::singleProcessExecuter > Got %s %s when trying to get stdout/stderr outputs of %s" % (type(e), e, " ".join(command)))
log.debug("::singleProcessExecuter > Got %s %s when trying to get stdout/stderr outputs of %s. Showing traceback:\n%s" % (type(e), e, " ".join(command), traceback.format_exc()))
raise
retval["exitCode"] = myPopy.returncode
retval["execTime"] = datetime.datetime.now() - startDatetime
#print(":singleProcessExecuter > This is %s's retval:\n%s" % (" ".join(parameter), retval))
return retval
你可以尝试一下:
print "This is the return: %s" % singleProcessExecuter(["ls", "-la"])