Bạn có thể cần gọi số wait
trên quy trình con của bạn và sau đó (khi đã hoàn tất), hãy kiểm tra trạng thái trong trường returncode
của cá thể tiến trình con.
Tôi có một thói quen nhỏ mà các cuộc gọi thứ, có lẽ nó sẽ giúp ...
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
Bạn có thể thử nó với:
print "This is the return: %s" % singleProcessExecuter(["ls", "-la"])
là '' wait'' thực sự cần thiết hoặc không '' giao tiếp() '' mất những điều khi quá trình này vẫn đang chạy? – user248237dfsf
@ user248237 Các tài liệu nói "mã trả về, được đặt bởi' poll() 'và' wait() '(và gián tiếp bởi' communication() ')." Vì vậy, 'communication()' nên cẩn thận chờ quá trình kết thúc. –