Récupère la valeur de retour du script python exécuté avec subprocess.Popen [duplicate]

Sep 15 2020

J'ai un main.pyqui s'exécute en file.pyutilisant subprocess.Popen:

# Execute request
url = "http://something:50001/dosomething/run"
test = ["python", "file.py", "url", url]
writer = subprocess.Popen(test, shell=False)

File.py exécute une fonction qui obtient un "code de sortie" quand il demande l'url:

exitCode = None
answer = requests.get(url)
janswer = answer.json()
exitCode = janswer.get("exitCode")
return exitCode

Pour une raison quelconque, j'ai besoin d'exécuter ceci en file.pyutilisant subprocess.Popenafin que du code en cours d' main.pyexécution file.pyfasse son travail.

Ce que j'essaye de faire maintenant, c'est de récupérer le exitCodede file.pyà main.py.

J'ai essayé d'utiliser stdout=subprocess.Pipeet de récupérer le code de sortie avec une impression, mais pour une raison quelconque, cela ne fonctionne pas.

Obtenir le writer.returncoden'est pas la solution car il me donnera le code du sous-processus, pas du retour de la fonction fonction, du retour du exitCode = -2sous-processus returncode = 0, j'ai besoin de -2. (-2 n'est qu'un exemple, le exitCoden'est pas toujours le même et dépend de certains paramètres.)

Réponses

DanielJunglas Sep 15 2020 at 18:07

Voici un petit programme qui illustre comment vous pouvez obtenir un nombre à partir d'un sous-processus via un tube ou sys.exit(). Notez que la plage de valeurs pouvant être renvoyée sys.exit()est cependant limitée.

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()

Cette imprime

42
exitcode 43