2010-05-12 5 views
3

Je souhaite récupérer l'erreur dans un fichier journal et enregistrer la valeur sous la forme d'une erreur. Quand j'utilise:Valeur de stockage de os.system ou os.popen

errors = os.system("cat log.txt | grep 'ERROR' | wc -l") 

Je reçois le code retour que la commande a fonctionné ou non. Quand j'utilise:

errors = os.popen("cat log.txt | grep 'ERROR' | wc -l") 

Je vois ce que la commande essaie de faire. Lorsque j'exécute ceci dans la ligne de commande, j'obtiens 3 comme nombre d'erreurs.

Quelqu'un peut-il suggérer un autre moyen en Python qui me permettra d'enregistrer la valeur de cette commande bash?

Merci

Répondre

6

popen est déprécié. Utilisez subprocess à la place. Par exemple, dans votre cas:

p1 = Popen(["cat", "log.txt"], stdout=PIPE) 
p2 = Popen(["grep", "ERROR"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 
1

Vous êtes probablement pour:

grep -c 'ERROR' log.txt 

Généralement pour le frai un sous-processus vous devez utiliser le module subprocess. Il y a beaucoup d'exemples, je suis sûr que vous ne vous perdriez pas.

+0

Le bash est bien, je veux enregistrer la sortie à la variable en Python – chrissygormley

1

D'abord, ouvrez un tuyau en utilisant popen comme vous l'avez fait.

p = os.popen("cat log.txt | grep 'ERROR' | wc -l") 

Maintenant, il suffit accéder à la conduite comme un fichier normal:

output = p.readline() 

Ce sera une chaîne de sorte que vous aurez encore à faire quelques parsing supplémentaires, mais cela ne devrait pas être un problème.

EDIT: Ok, il semble qu'à partir de Python 2.6, os.popen est obsolète. Je reporte donc ma réponse à celui qui a répondu correctement en utilisant subprocess.Popen à la place. Merci pour ça les gars.

+0

J'ai fourni des alternatives possibles http://stackoverflow.com/questions/2817416/store-value-of-os-system-or- os-popen/2817565 # 2817565 – jfs

0

Combien de 'ERROR' dans le fichier:

nerrors = open('log.txt').read().count('ERROR') # put whole file in memory 

Combien de lignes qui contiennent 'ERROR':

nerrors = sum(1 for line in open('log.txt') if 'ERROR' in line) # line at a time 

Si vous devez utiliser la ligne bash littérale puis en Python 2.7+:

from subprocess import check_output as qx 
nerrors = int(qx("cat your_file.txt | grep 'ERROR' | wc -l", shell=True)) 

Voir Capturing system command output as a string pour une implémentation de check_output() pour Python < 2.7.