1
votes

Comment obtenir le code de retour à l'aide d'un sous-processus

J'essaie donc d'exécuter un fichier et de récupérer la valeur retournée en utilisant les méthodes intégrées python disponibles dans la bibliothèque de sous-processus.

Par exemple, disons que je veux exécuter ce fichier python hello_world:

(0, '')

Je me fiche de récupérer l'instruction dans main . Ce que je veux récupérer, c'est la valeur de retour hello world! .

J'ai essayé de nombreuses choses mais aucune n'a fonctionné.

Voici une liste de ce que J'ai essayé et leurs sorties:

args est commun à tous les essais: args = ['python', hello_cmd]

Premier essai:

p5 =subprocess.getstatusoutput(args)
print(p5)

La sortie est:

CompletedProcess(args=['python', '/path/to/file/hello.py'], returncode=0, stdout=b'in main\n', stderr=b'')

deuxième essai:

p4 = subprocess.run(args, stdout=PIPE, stderr=PIPE)
print(p4)

le résultat est:

b'in main\n'
b''

troisième essai: p>

output, result = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=False).communicate()
print(output)
print(result)

la sortie est:

b'in main\n'

quatrième essai:

p2 = subprocess.check_output(args,stderr=subprocess.STDOUT)
print(p2)

sortie est:

(b'in main\n', None)
returncode is:
0

cinquième essai:

p1 = subprocess.Popen(args, stdout=subprocess.PIPE)

print(p1.communicate())
print("returncode is:")
print(p1.returncode)

le résultat est:

def main():
    print("in main")
    return("hello world!")

if __name__ == '__main__':
    main()

Quelqu'un peut-il aider?


2 commentaires

Je ne connais aucun système d'exploitation prenant en charge les codes de retour non numériques. Si vous voulez passer la chaîne 'hello world!' au processus parent, vous devez soit passer par un fichier, soit par stdout / stderr.


@ 0x5453 même si le retour était une valeur au lieu de bonjour le monde! , pourtant, aucune de ces réponses ne fonctionnerait!


3 Réponses :


0
votes

Vous ne pouvez pas renvoyer de chaînes en tant que codes de retour, il doit s'agir d'un entier. Si vous souhaitez agir différemment selon le processus. Essayez de mapper votre code retour à une fonction de votre programme principal. Par exemple

def execute_sub_program(): ... 

# somewhere else:
return_code = execute_sub_program()
if return_code == 0: 
    # do something ...
elif ...


0 commentaires

0
votes

Vous pouvez essayer avec subprocess.run (). returncode , il donne 0 en cas d'exécution réussie et 1 en cas d'échec de l'exécution.


driver.py

def main():
    print("in main")
    raise ValueError('Failed')

if __name__ == '__main__':
    main()

Pour un flux heureux (hello_cmd.py):

def main():
    print("in main")
    return("hello world!")

if __name__ == '__main__':
    main()

Pour un flux ayant échoué (hello_cmd.py ):

import subprocess

args = ['python', './hello_cmd.py']
status_code = subprocess.run(args).returncode
print(["Successful execution", "Failed execution"][status_code])


0 commentaires

2
votes

La valeur de retour de la fonction principale n'est pas le code de retour qui est passé au système d'exploitation. Pour transmettre un code de retour au système d'exploitation, utilisez sys.exit () , qui attend un entier. Vous pouvez lui passer une chaîne, mais si vous le faites, Python transmettra 1 au système d'exploitation.


0 commentaires