Rückgabewert aus Python-Skript abrufen, das mit subprocess.Popen [duplicate] ausgeführt wurde
Ich habe eine main.py, die ausführen file.pymit subprocess.Popen:
# Execute request
url = "http://something:50001/dosomething/run"
test = ["python", "file.py", "url", url]
writer = subprocess.Popen(test, shell=False)
File.py führt eine Funktion aus, die einen "Exit-Code" erhält, wenn sie die URL anfordert:
exitCode = None
answer = requests.get(url)
janswer = answer.json()
exitCode = janswer.get("exitCode")
return exitCode
Aus irgendeinem Grund muss ich dies file.pymit ausführen , subprocess.Popendamit ein Teil des Codes main.pyausgeführt wird, während er file.pyseine Aufgaben erledigt.
Was ich jetzt versuche, ist, das exitCodevon file.pybis wiederherzustellen main.py.
Ich habe versucht, stdout=subprocess.Pipeden Exit-Code mit einem Ausdruck zu verwenden und wiederherzustellen, aber aus irgendeinem Grund funktioniert er nicht.
Das zu bekommen writer.returncodeist nicht die Lösung dafür, weil es mir den Code aus dem Unterprozess gibt, nicht aus der Funktionsfunktion return exitCode = -2, subprocess return returncode = 0, ich brauche das -2. (-2 ist nur ein Beispiel, das exitCodeist nicht immer gleich und hängt von einigen Parametern ab.)
Antworten
Hier ist ein kurzes Programm, das zeigt, wie Sie eine Nummer aus einem Unterprozess entweder über Pipe oder erhalten können sys.exit(). Beachten Sie jedoch, dass der Wertebereich, aus dem zurückgegeben werden kann, sys.exit()begrenzt ist.
import sys
import subprocess
def sub():
try:
print(42)
except:
# Print something even in case of an exception
print(-1)
raise
sys.exit(43)
def main():
writer = subprocess.Popen(["python3", sys.argv[0], "sub"],
stdout = subprocess.PIPE)
for line in writer.stdout:
print(int(line))
exitcode = writer.wait()
print('exitcode', exitcode)
if len(sys.argv) > 1 and sys.argv[1] == 'sub':
sub()
else:
main()
Dies wird gedruckt
42
exitcode 43