2016-05-04 4 views
2
>>> import subprocess 
>>> child = subprocess.Popen(["ls", "examples/*"], stdout=subprocess.PIPE) 
>>> ls: examples/*: No such file or directory 

Aber von Terminal funktioniert essubprocess ls Beispiele/* keine fuch Datei oder das Verzeichnis

Beagle:kumarshubham$ ls examples/* 
examples/convert_greyscale.py  examples/feat_det_harris_corner.py examples/read_display_image.py 
examples/example_set_roi.py  examples/manipulate_img_matplotlib.py examples/remove_matplotlib_cache.py 

Kann mir führen, wo ich falsch gehe?

Antwort

1
import subprocess 
child = subprocess.Popen(["cd /to-your-PATH/; ls", "examples/*"],shell=True, stdout=subprocess.PIPE) 
child.stdout.read() 
1

Dies ist wegen (*) Wildcard-Nutzung. Sie müssen Shell liefern = True den Befehl durch Shell-Interpreter

>>> import subprocess 
>>> child = subprocess.Popen(["ls", "examples/*"], stdout=subprocess.PIPE, shell=True) 
1

Sie sollten shell=True auch in Ihrem Popen Gespräch noch auszuführen, wenn * in Ihrem Fall nutzlos, ls examples/ sollte die gleiche Ausgabe zurück:

child = subprocess.Popen(["ls", "examples/*"], stdout=subprocess.PIPE, shell=True) 

plus mehr pythonic Ansatz könnte sein:

import os 
os.listdir('examples') 
1

Sie zusätzliche p verwenden können arameter shell = True, dann würde es aussehen:

child = subprocess.Popen(["ls", "examples/*"], shell=True, stdout=subprocess.PIPE) 

NB! auch das wird funktionieren, - nach offiziellen Python-Dokumentation https://docs.python.org/2/library/subprocess.html mit Shell = True könnte ein Sicherheitsproblem sein.