Obtenha o valor de retorno do script Python executado com subprocess.Popen [duplicado]
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
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