J'essaie d'utiliser la commande grep dans un script python en utilisant le module de sous-processus.

Voici ce que j'ai:

userid = 'foo12'
p = subprocess.Popen(['grep', "%s *.log"%userid], stdout=subprocess.PIPE)

Et ça ne renvoie rien. Je ne suis pas tout à fait sûr de ce que je fais mal, alors quelqu'un peut-il expliquer. La méthode actuelle que j'utilise qui fonctionne est en ajoutant le shell = true qui lui fait sortir la sortie correcte mais comme les pages d'aide l'ont souligné, ce n'est pas sûr. J'ai besoin d'aide pour essayer de faire en sorte que mon script ne soit pas dangereux.

13
Jason Zhu 31 oct. 2011 à 20:52

2 réponses

Je suppose que vous voulez grep pour 'foo12' dans tous les fichiers qui se terminent par '.log', pour que cela fonctionne avec subprocess, vous devrez changer votre code comme suit:

userid = 'foo12'
p = subprocess.Popen('grep %s *.log' % userid, stdout=subprocess.PIPE, shell=True)

shell=True est nécessaire pour l'extension générique, et lorsque cette option est définie, vous devez fournir une commande de chaîne au lieu d'une liste.

Assurez-vous également que lorsque vous fournissez une liste d'arguments que chaque argument est une entrée distincte dans la liste, votre code initial aurait été équivalent à ce qui suit:

grep 'foo12 *.log'
5
Andrew Clark 31 oct. 2011 à 17:24

Voici deux morceaux de code testés à partir desquels vous pouvez modéliser:

>>> print subprocess.check_output(['grep', 'python', 'api_talk.txt'])
Discuss python API patterns
Limitations of python
Introspection in python

>>> print subprocess.check_output('grep python *.txt', shell=True)

Utilisez ce dernier si vous voulez que le shell fasse une expansion générique pour vous. Lorsque shell est True , assurez-vous de placer la commande entière dans une seule chaîne plutôt que dans une liste de champs séparés.

9
Raymond Hettinger 31 oct. 2011 à 17:19