On Aug 20, 2009, at 10:13 PM, Ben Finney wrote:
The module documentation has a section on replacing ‘os.system’
<http://docs.python.org/library/subprocess#replacing-os-system>, which
says to use::

   process = subprocess.Popen("mycmd" + " myarg", shell=True)
   status = os.waitpid(process.pid, 0)

But a ‘Popen’ instance has its own ‘wait’ method, which waits for exit
<URL:http://docs.python.org/library/subprocess#subprocess.Popen.wait>.
Why would I use ‘os.waitpid’ instead of::

   process = subprocess.Popen("mycmd" + " myarg", shell=True)
   process.wait()
   status = process.returncode

Really, you can just use:

  process = subprocess.Popen("mycmd" + " myarg", shell=True)
  status = process.wait()

I'm not sure why the documentation suggests using os.waitpid.

I would recommend avoiding shell=True whenever possible. It's used in the examples, I suspect, to ease the transition from the functions being replaced, but all it takes is for a filename or some other input to unexpectedly contain whitespace or a metacharacter and your script will stop working--or worse, do damage (cf. the iTunes 2 installer debacle[1]). Leaving shell=False makes scripts more secure and robust; besides, when I'm putting together a command and its arguments, it's as convenient to build a list (['mycmd', 'myarg']) as it is a string (if not more so).

-Miles

[1]: http://apple.slashdot.org/article.pl?sid=01/11/04/0412209#comment_2518563
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to