2017-10-16 6 views
0

J'ai besoin d'aide avec le code python pour exécuter plusieurs commandes shell en Python. J'ai écrit le code suivant mais je reçois une erreur. Comme je passe le fichier à la commande. S'il vous plaît laissez-moi savoir le processus correct sur la façon d'exécuter plusieurs commandes canalisées en python.Exécution de commandes shell en Python

EG: cat file|grep -i hostname|grep -i fcid 

est la commande shell que je veux exécuter. Voici mon code python. Je reçois None lorsque je cours le code. Je redirige la sortie finale vers un fichier.

#!/usr/bin/python3 

import subprocess 

op = open("text.txt",'w') 
file="rtp-gw1" 

print("file name is {}".format(file)) 
#cat file|grep -i "rtp1-VIF"|grep -i "fcid" 

#cmd ='cat file|grep -i "rtp1-vif"' 
p1 = subprocess.Popen(['cat',file],stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True) 
p2 = subprocess.Popen(['grep','-i', '"rtp1-vif"',file], stdin=p1.stdout, stdout=subprocess.PIPE,stderr= subprocess.PIPE,shell=Ture) 
p1.stdout.close() 
p3 = subprocess.Popen(['grep', '-i',"fcid"],stdin=p1.stdout, stdout=op,stderr= subprocess.PIPE,shell=Ture) 
p2.stdout.close() 

result = p3.communicate()[0] 

print(result) 
+0

'shell = Ture'? sérieusement? –

+0

btw pourquoi utiliser 'cat'? 'grep' peut prendre un fichier en entrée que vous connaissez –

+0

Essayez de fermer les fichiers en utilisant' p1.communicate(), p2.communicate() 'et placez-les tous à la fin après avoir obtenu le résultat – Vinny

Répondre

0

vous n'obtenez aucun résultat en raison de cette ligne:

['grep','-i', '"rtp1-vif"'] 

ce passe "rtp1-vif"littéralement avec des guillemets: aucune correspondance.

noter que tout le processus de tuyauterie est trop compliqué. Pas besoin d'utiliser cat car le premier grep peut prendre le fichier en entrée.

Et pour aller plus loin, il est vraiment facile d'effectuer cette tâche en python pur. Quelque chose comme:

with open("text.txt",'w') as op: 
    file="rtp-gw1" 

    for line in file: 
     line = line.lower() 
     if "rtp1-vif" in line and "fcid" in line: 
      op.write(line) 

maintenant votre code peut fonctionner sur toute plate-forme, sans qu'il soit nécessaire d'émettre des commandes externes. C'est probablement plus rapide aussi.

0

Merci. C'est ainsi que j'ai commencé à avoir des fichiers de plus de 100 000 lignes. Je dois trouver des lignes manquantes entre chaque fichier. Je ne reçois pas les résultats que je veux. C'est la raison pour laquelle je voulais essayer les commandes du système mais j'essaierai certainement en boucle.