Comment puis-je appeler un programme externe avec un script python et récupérer le code de sortie et de retour?Comment appeler un programme externe en python et récupérer le code de sortie et de retour?
Répondre
Regardez le module subprocess: un exemple simple ...
from subprocess import Popen, PIPE
process = Popen(["ls", "-la", "."], stdout=PIPE)
(output, err) = process.communicate()
exit_code = process.wait()
J'ai modifié la réponse ci-dessus pour refléter la suggestion d'Ambroz au cas où quelqu'un le ferait pas lu les commentaires et utilise le code précédemment incorrect. –
si cela ne fonctionne pas pour une raison quelconque, vous pouvez ajouter shell = True aux paramètres (dans les fenêtres?) – ntg
Il semble que [la solution ci-dessus] (https://stackoverflow.com/a/707001/1321680) peut être remplacé par un simple appel ['subprocess.run()'] (https://docs.python.org/dev/library/subprocess.html#subprocess.run) (Python> = 3.5 est requis). –
Vérifiez le module subprocess ici: http://docs.python.org/library/subprocess.html#module-subprocess. Il devrait obtenir ce dont vous avez besoin.
Après commentaire précédent Ambroz Bizjak, voici une solution qui a fonctionné pour moi:
import shlex
from subprocess import Popen, PIPE
cmd = "..."
process = Popen(shlex.split(cmd), stdout=PIPE)
process.communicate()
exit_code = process.wait()
C'est de loin la meilleure réponse. – dotancohen
J'ai un post similaire [ici] (https://stackoverflow.com/questions/1996518/retrieving-the-output-of-subprocess-call/21000308#21000308) qui montre comment obtenir trois choses à partir d'un processus: exitcode , stdout, stderr. – Jabba
Après quelques recherches, j'ai le code suivant qui fonctionne très bien pour moi. Il imprime à la fois stdout et stderr en temps réel. J'espère que cela aidera quelqu'un d'autre qui en a besoin.
stdout_result = 1
stderr_result = 1
def stdout_thread(pipe):
global stdout_result
while True:
out = pipe.stdout.read(1)
stdout_result = pipe.poll()
if out == '' and stdout_result is not None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
def stderr_thread(pipe):
global stderr_result
while True:
err = pipe.stderr.read(1)
stderr_result = pipe.poll()
if err == '' and stderr_result is not None:
break
if err != '':
sys.stdout.write(err)
sys.stdout.flush()
def exec_command(command, cwd=None):
if cwd is not None:
print '[' + ' '.join(command) + '] in ' + cwd
else:
print '[' + ' '.join(command) + ']'
p = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd
)
out_thread = threading.Thread(name='stdout_thread', target=stdout_thread, args=(p,))
err_thread = threading.Thread(name='stderr_thread', target=stderr_thread, args=(p,))
err_thread.start()
out_thread.start()
out_thread.join()
err_thread.join()
return stdout_result + stderr_result
J'ai développé une petite bibliothèque (py-execute) qui vous permet d'exécuter des programmes externes, permet de récupérer la sortie et la retcode et, en même temps obtenir une sortie dans la console en temps réel:
>>> from py_execute.process_executor import execute
>>> ret = execute('echo "Hello"')
Hello
>>> ret
(0, 'Hello\n')
Vous pouvez éviter d'imprimer à la console passant une user_io maquette:
>>> from mock import Mock
>>> execute('echo "Hello"', ui=Mock())
(0, 'Hello\n')
je l'ai écrit parce qu'avec plaine Popen (en Python 2.7) J'avais du mal à exécuter comm ets avec une sortie longue
- 1. Appeler un programme externe de python
- 2. Comment exécuter un programme externe et obtenir le code retour dans un Firefox-Addon
- 3. Démarrage d'un programme externe en Java et tuyauterie sa sortie
- 4. obtenir le code de sortie pour le programme python
- 5. Comment lancer et exécuter un script externe en arrière-plan?
- 6. Quel est l'équivalent Windows/cmd.exe de Linux/bash's $? - le code de sortie/retour du programme?
- 7. Comment appeler un service web externe en utilisant jquery "jsonp"?
- 8. python: lancer un processus avec temporisation et stdout de capture, stderr et état de sortie
- 9. Java IO entréestream bloque en lisant la sortie standard et l'erreur standard d'un programme externe C
- 10. Récupération de la valeur de retour d'un script Python
- 11. Meilleure façon de récupérer le contenu d'un site Web en externe
- 12. Structurer un programme. Classes et fonctions en Python
- 13. Fonction python pour récupérer la clé et le cryptage
- 14. Appelez Python à partir du fichier Bat et obtenez le code de retour
- 15. Comment appeler du code Python depuis Ruby?
- 16. Comment puis-je appeler un programme externe de longue durée à partir d'Excel/VBA?
- 17. comment appeler le code de gestionnaire d'événements de code javascript
- 18. De combien de façons pouvez-vous appeler un sous-programme et ignorer son prototype en Perl?
- 19. et sortie sans une bibliothèque en C
- 20. Comment récupérer du code HTML en Java
- 21. Conversion de chaîne en durée et retour
- 22. Récupérer la valeur de retour de la procédure stockée DB2
- 23. Comment analyser par programme et modifier le code C#
- 24. Appeler un classmethod de la classe de base en Python
- 25. Raccourcir un segment de code souvent utilisé pour tester une valeur de retour en Python
- 26. Comment charger et swf externe et gotoAndPlay() avec un bouton
- 27. Possible: Programme exécutant le code Qt3 et Qt4?
- 28. Comment supprimer le retour chariot en python 2?
- 29. Comment définir sys.excepthook pour appeler globalement pdb en python?
- 30. Comment emballer un programme CLI en Python (en gardant l'interactivité)?
Il existe quelques questions et réponses sur SO qui vous aideront: http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python –
Possible duplicate de [Appel d'une commande externe en Python] (http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) –