web-dev-qa-db-fra.com

Python subprocess.Popen () (aucun fichier ou répertoire de ce type)

J'essaye de compter le nombre de lignes dans un fichier en utilisant Python fonctions. Dans le répertoire courant, tandis que os.system("ls") trouve le fichier, la commande subprocess.Popen(["wc -l filename"], stdout=subprocess.PIPE) ne marche pas.

Voici mon code:

>>> import os
>>> import subprocess
>>> os.system("ls")
sorted_list.dat
0
>>> p = subprocess.Popen(["wc -l sorted_list.dat"], stdout=subprocess.PIPE)File "<stdin>", line 1, in <module>
File "/Users/a200/anaconda/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
File "/Users/a200/anaconda/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
18
user2105632

Vous devez passer les arguments sous forme de liste (recommandé):

subprocess.Popen(["wc", "-l", "sorted_list.dat"], stdout=subprocess.PIPE)

Sinon, vous devez passer Shell=True si vous souhaitez utiliser l'ensemble "wc -l sorted_list.dat" chaîne en tant que commande (non recommandé, peut être un risque pour la sécurité).

subprocess.Popen("wc -l sorted_list.dat", Shell=True, stdout=subprocess.PIPE)

En savoir plus sur Shell=True problèmes de sécurité ici .

33
bakkal

L'erreur se produit car vous essayez d'exécuter une commande nommée wc -l sorted_list.dat, c'est-à-dire qu'il essaie de trouver un fichier nommé comme "/usr/bin/wc -l sorted dat".

Divisez vos arguments:

["wc", "-l", "sorted_list.dat"]
5
Antti Haapala