12

subprocess.Popen次のようにPythonでプロセスを呼び出す場合:

myproc = subprocess.Popen(...).communicate()

そのステータスを確認する正しい方法は何ですか?stdoutまたはstderrへの出力ではなく、終了後の終了ステータス(たとえば、成功の場合は0、失敗の場合は別)?

4

3 に答える 3

24

returncode確かに答えですが、解決策は複雑である必要はありません。

process = subprocess.Popen(...)
stdoutdata, stderrdata = process.communicate()
print process.returncode

詳細については、Pythonsubprocessドキュメントを参照してください。

于 2012-12-26T16:12:29.653 に答える
10

プロセスには、実行が完了するまでリターン コードはありません。したがって、まだ終了していない場合は、何をしたいかを決定する必要があります。それを待つか、「まだ終了していません」というインジケータを返すかです。

待機する場合は、使用してから属性communicateを確認してください。returncode

戻りコードが設定されているかどうかを確認し、設定されNoneていない場合は戻りたい場合は、 を使用しますPopen.poll()

Popen.poll()

子プロセスが終了したかどうかを確認します。returncode 属性を設定して返します。

(プロセスが終了していない場合は をpoll()返しますNone)

于 2012-12-26T16:15:00.997 に答える
1

waitサブプロセスで a を呼び出し、 (完了したら)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"])
于 2012-12-26T16:08:14.490 に答える