[Tutor] Running external commands from Python

Steven D'Aprano steve at pearwood.info
Sat Jun 26 02:16:16 CEST 2010

On Sat, 26 Jun 2010 08:46:17 am Randy Kao wrote:
> Hi all,
> I'm a newbie to Python (switching from Perl) and had a question about
> the best way to run external commands in Python.
> through: os.popen, os.popen2, os.popen3, os.system,
> commands.getoutput()

os.system is the oldest way, and it's pretty much obsolete. Only use it 
for quick-and-dirty scripts when you're too lazy to do the right thing 
and don't care who knows it. It doesn't capture either stdin or stdout, 
only the return value.

os.popen, popen2 and popen3 are probably closer to what you're used to 
in Perl. They basically differ in how many file handles they return:

popen returns the external command's stdout as a file handle.
popen2 returns (stdin, stdout)
popen3 returns (stdin, stdout, stderr)

The commands module is meant as an easier to use front end to the popen* 
functions, for times where popen* are too much and system is too 
little. If all you want is the output (stdout + stderr) of an external 

import commands
output = commands.getoutput('ls -l foo*')

will do the trick.

Steven D'Aprano

More information about the Tutor mailing list