2015-05-03 70 views
12

Próbuję policzyć liczbę linii w pliku przy użyciu funkcji Python. W bieżącym katalogu, podczas gdy os.system("ls") znajduje plik, polecenie subprocess.Popen(["wc -l filename"], stdout=subprocess.PIPE) nie działa.Python subprocess.Popen() błąd (Brak takiego pliku lub katalogu)

Oto mój kod:

>>>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 

Odpowiedz

20

należy podać argumenty w postaci listy (zalecane):

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

W przeciwnym razie trzeba przejść shell=True jeśli chcesz używać cały "wc -l sorted_list.dat" ciąg jako polecenie (niezalecane, może być zagrożeniem bezpieczeństwa).

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

Przeczytaj więcej o shell=True kwestie bezpieczeństwa here.

3

Błąd występuje, ponieważ próbujesz uruchomić polecenie o nazwie wc -l sorted_list.dat, to znaczy, że stara się znaleźć plik nazwie jak "/usr/bin/wc -l sorted dat".

podzielić argumenty:

["wc", "-l", "sorted_list.dat"] 
Powiązane problemy