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?
3 Réponses :
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 ...
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])
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.
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!