2015-05-03 18 views
12

Ich versuche, die Anzahl der Zeilen in einer Datei mit Python-Funktionen zu zählen. Im aktuellen Verzeichnis, während os.system("ls") die Datei findet, funktioniert der Befehl subprocess.Popen(["wc -l filename"], stdout=subprocess.PIPE nicht.Python subprocess.Popen() Fehler (Keine solche Datei oder das Verzeichnis)

Hier ist mein 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 

Antwort

20

Sie sollten die Argumente als Liste (empfohlen) übergeben:

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

Andernfalls müssen Sie shell=True passieren, wenn Sie die ganze "wc -l sorted_list.dat" verwenden möchten Zeichenfolge als Befehl (nicht empfohlen, kann ein Sicherheitsrisiko sein).

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

Lesen Sie mehr über shell=True Sicherheitsfragen here.

3

Der Fehler tritt auf, weil Sie wc -l sorted_list.dat, das heißt, einen Befehl auszuführen versuchen, es versucht, eine Datei wie "/usr/bin/wc -l sorted dat" Namen zu finden.

Split Ihre Argumente:

["wc", "-l", "sorted_list.dat"]