On Thu, Mar 27, 2008 at 10:53 AM, Skip Montanaro <[EMAIL PROTECTED]> wrote: > I am trying to replace os.system calls with subprocess.Popen. This simple > example fails miserably: > > >>> proc = subprocess.Popen ("ls /tmp") > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "/home/titan/skipm/local/lib/python2.5/subprocess.py", line 594, in > __init__ > errread, errwrite) > File "/home/titan/skipm/local/lib/python2.5/subprocess.py", line 1091, in > _execute_child > raise child_exception > OSError: [Errno 2] No such file or directory > > I also tried explicitly referencing /usr/bin/ls. Same result. What gives?
It's looking for an executable named "ls /tmp" Since it can't find one, it raises an exception. If you just want to replace an os.system call, you need to pass shell=True to Popen, like this: proc = subprocess.Popen("ls /tmp", shell=True) That will get the shell to split your string into the program to be called, and the argument(s) to the program. Alternatively, you can do it yourself by passing a sequence to Popen: proc = subprocess.Popen(["ls", "/tmp"]) Take a look at the documentation for Popen (http://docs.python.org/lib/node528.html) and the specific examples for replacing os.system (http://docs.python.org/lib/node536.html) -- Jerry -- http://mail.python.org/mailman/listinfo/python-list