Ottieni il valore di ritorno dallo script Python eseguito con subprocess.Popen [duplicate]
Ho un main.pyche esegue file.pyusando subprocess.Popen:
# Execute request
url = "http://something:50001/dosomething/run"
test = ["python", "file.py", "url", url]
writer = subprocess.Popen(test, shell=False)
File.py esegue una funzione che ottiene un "codice di uscita" quando richiede l'URL:
exitCode = None
answer = requests.get(url)
janswer = answer.json()
exitCode = janswer.get("exitCode")
return exitCode
Per qualche motivo, ho bisogno di eseguirlo file.pyusando in subprocess.Popenmodo che un po 'di codice in main.pyesecuzione mentre file.pyfaccia le sue cose.
Quello che sto cercando di fare ora è recuperare exitCodeda file.pya main.py.
Ho provato a utilizzare stdout=subprocess.Pipee recuperare il codice di uscita con una stampa, ma per qualche motivo non funziona.
Ottenere la writer.returncodenon è la soluzione perché mi darà il codice dal sottoprocesso, non dalla funzione funzione return exitCode = -2, subprocess return returncode = 0, ho bisogno di -2. (-2 è solo un esempio, exitCodenon è sempre lo stesso e dipende da alcuni parametri.)
Risposte
Ecco un breve programma che illustra come ottenere un numero da un sottoprocesso tramite pipe o sys.exit(). Si noti che l'intervallo di valori da cui è possibile restituire sys.exit()è tuttavia limitato.
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()
Questo stampa
42
exitcode 43