J'ai un script python qui doit exécuter plusieurs utilitaires de ligne de commande. La sortie stdout est parfois utilisée pour un traitement ultérieur. Dans tous les cas, je veux enregistrer les résultats et déclencher une exception si une erreur est détectée. J'utilise la fonction suivante pour y parvenir:J'ai besoin d'un meilleur moyen d'exécuter des commandes de console à partir de python et de consigner les résultats
def execute(cmd, logsink):
logsink.log("executing: %s\n" % cmd)
popen_obj = subprocess.Popen(\
cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = popen_obj.communicate()
returncode = popen_obj.returncode
if (returncode <> 0):
logsink.log(" RETURN CODE: %s\n" % str(returncode))
if (len(stdout.strip()) > 0):
logsink.log(" STDOUT:\n%s\n" % stdout)
if (len(stderr.strip()) > 0):
logsink.log(" STDERR:\n%s\n" % stderr)
if (returncode <> 0):
raise Exception, "execute failed with error output:\n%s" % stderr
return stdout
« logsink » peut être un objet python avec une méthode de journal. Je l'utilise généralement pour transmettre les données de journalisation à un fichier spécifique, ou l'écho à la console, ou les deux, ou autre chose ...
Cela fonctionne très bien, sauf pour trois problèmes où j'ai besoin de plus de grain le contrôle de la communication() méthode prévoit:
- stdout et stderr peuvent être intercalés sur la console , mais la fonction ci-dessus se connecte séparément. Cela peut compliquer l'interprétation du journal . Comment puis-je journaliser les lignes stdout et stderr entrelacées, dans le même ordre que lorsqu'elles ont été générées?
- La fonction ci-dessus enregistre uniquement la sortie de la commande une fois que la commande a terminé . Cela complique le diagnostic des problèmes lorsque les commandes sont bloquées dans une boucle infinie ou prennent beaucoup de temps pour une autre raison. Comment puis-je obtenir le journal en temps réel, alors que la commande est toujours en cours d'exécution?
- Si les journaux sont volumineux, il peut être difficile d'interpréter quelle commande a généré quelle sortie. Y a-t-il une façon de préfixer chaque ligne avec quelque chose (par exemple le premier mot de la chaîne cmd suivie de :).
Quel est le problème avec le package de journalisation. Qu'est-ce que tu n'utilises pas? –
@ S.Lott: la fonction d'exécution a juste besoin de quelque chose pour envoyer la sortie. Utiliser un objet logging.Logger compliquerait les choses car alors la fonction execute devrait savoir à quel niveau se connecter (debug, info ... warning ...). Ces préoccupations sont en dehors de la responsabilité de la fonction d'exécution. –
Félicitations! –