Ottieni il valore di ritorno dallo script Python eseguito con subprocess.Popen [duplicate]

Sep 15 2020

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

DanielJunglas Sep 15 2020 at 18:07

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