Python Sous-processus Grep
J'essaie d'utiliser la commande grep dans un script python à l'aide de la sous-processus module.
Voici ce que j'ai:
userid = 'foo12'
p = subprocess.Popen(['grep', "%s *.log"%userid], stdout=subprocess.PIPE)
Et elle ne retourne rien.
Je ne suis pas entièrement sûr de ce que je fais de mal si quelqu'un peut expliquer. La méthode actuelle que j'utilise que des œuvres se fait par l'ajout du shell=true qui provoque la sortie de la sortie correcte mais comme les pages d'aide, ont souligné qu'il est dangereux. J'ai besoin d'aide pour essayer de faire ce travail pour que mon script n'est pas dangereux.
source d'informationauteur Jason Zhu
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes heurte à deux problèmes:
Cet appel:
ne fonctionnera pas comme prévu sans
shell=True
parce que la liste des arguments qui sont passés directement àos.execvp
qui exige que chaque élément à une seule chaîne de caractères représentant un argument. Vous avez écrasé deux arguments ensemble dans une seule chaîne (en d'autres termes, la commande grep est l'interprétation de "foo12 *.log
" comme le modèle de recherche, et pas de motif+liste des fichiers).Vous pouvez résoudre ce problème en disant:
Le deuxième problème est que, encore une fois sans
shell=True
execvp
ne sais pas ce que tu veux dire par*.log
et les transmet directement le long de grep, sans passer par le shell de l'expansion des caractères génériques mécanisme. Si vous ne souhaitez pas utilisershell=True
vous pouvez à la place faire quelque chose comme:Voici deux testé des morceaux de code modèle:
Utiliser ce dernier, si vous voulez que le shell pour faire expansion des caractères génériques pour vous. Lorsque shell est Vraiassurez-vous de mettre l'ensemble de la commande en une seule chaîne plutôt qu'une liste de champs séparés.
Je suis en supposant que vous voulez grep pour "foo12" dans tous les fichiers qui se terminent par '.le journal', pour arriver au travail avec
subprocess
vous aurez besoin de changer votre code de la manière suivante:shell=True
est nécessaire pour l'expansion des caractères génériques, et lorsque cette option est activée, vous devez fournir une chaîne de commande au lieu d'une liste.Aussi, assurez-vous que lorsque vous fournissez une liste d'arguments que chaque argument est une entrée dans la liste, votre code initial aurait été équivalente à la suivante: