Obtenha o valor de retorno do script Python executado com subprocess.Popen [duplicado]

Sep 15 2020

Eu tenho um main.pyque executa 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 executa uma função que obtém um "código de saída" ao solicitar o url:

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

Por alguma razão, preciso executar isso file.pyusando subprocess.Popenpara que algum código seja main.pyexecutado enquanto file.pyfaz seu trabalho.

O que estou tentando fazer agora é recuperar o exitCodede file.pypara main.py.

Tentei usar stdout=subprocess.Pipee recuperar o código de saída com uma impressão, mas por algum motivo não funcionou.

Obter o writer.returncodenão é a solução para porque ele me dará o código do subprocesso, não do retorno da função função exitCode = -2, retorno do subprocesso returncode = 0, eu preciso desse -2. (-2 é apenas um exemplo, exitCodenão é o mesmo o tempo todo e depende de alguns parâmetros.)

Respostas

DanielJunglas Sep 15 2020 at 18:07

Aqui está um pequeno programa que ilustra como você pode obter um número de um subprocesso via pipe ou sys.exit(). Observe que o intervalo de valores que podem ser retornados sys.exit()é limitado, no entanto.

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

Isto imprime

42
exitcode 43