From: Nobody on 10 Jun 2010 07:52 On Wed, 09 Jun 2010 21:15:48 -0700, Chris Seberino wrote: > How do subprocess.Popen("ls | grep foo", shell=True) with shell=False? The same way that the shell does it, e.g.: from subprocess import Popen, PIPE p1 = Popen("ls", stdout=PIPE) p2 = Popen(["grep", "foo"], stdin=p1.stdout, stdout = PIPE) p1.stdout.close() result = p2.communicate()[0] p1.wait() Notes: Without the p1.stdout.close(), if the reader (grep) terminates before consuming all of its input, the writer (ls) won't terminate so long as Python retains the descriptor corresponding to p1.stdout. In this situation, the p1.wait() will deadlock. The communicate() method wait()s for the process to terminate. Other processes need to be wait()ed on explicitly, otherwise you end up with "zombies" (labelled "<defunct>" in the output from "ps"). > Does complex commands with "|" in them mandate shell=True? No. Also, "ls | grep" may provide a useful tutorial for the subprocess module, but if you actually need to enumerate files, use e.g. os.listdir/os.walk() and re.search/fnmatch, or glob. Spawning child processes to perform tasks which can easily be performed in Python is inefficient (and often creates unnecessary portability issues).
|
Pages: 1 Prev: xml-rpc UnicodeDecodeError Next: numpy arrays to python compatible arrays |