Obtenga el valor de retorno del script de Python ejecutado con subprocess.Popen [duplicado]

Sep 15 2020

Tengo un main.pyque se ejecuta 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 ejecuta una función que obtiene un "código de salida" cuando solicita la URL:

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

Por alguna razón, necesito ejecutar esto file.pyusando subprocess.Popenpara que algo de código se main.pyejecute mientras file.pyhace sus cosas.

Lo que estoy intentando hacer ahora es recuperar el exitCodedesde file.pyhasta main.py.

Intenté usar stdout=subprocess.Pipey recuperar el código de salida con una impresión, pero por alguna razón no funciona.

Obtener el writer.returncodeno es la solución porque me dará el código del subproceso, no de la función retorno de la función, retorno del exitCode = -2subproceso returncode = 0, necesito ese -2. (-2 es solo un ejemplo, exitCodeno es el mismo todo el tiempo y depende de algunos parámetros).

Respuestas

DanielJunglas Sep 15 2020 at 18:07

Aquí hay un programa corto que ilustra cómo puede obtener un número de un subproceso a través de una tubería o sys.exit(). Sin sys.exit()embargo, tenga en cuenta que el rango de valores que se pueden devolver es limitado.

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

Esto imprime

42
exitcode 43