Récupère la valeur de retour du script python exécuté avec subprocess.Popen [duplicate]
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
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