How do you conver output of "popen('ls')" to a list?

Grant Edwards grante at visi.com
Thu Feb 21 03:56:18 CET 2002


In article <mailman.1014253235.29718.python-list at python.org>, Neil Schemenauer wrote:
> husam wrote:

>> os.listdir('.') gets you all the files in the '.' dircetory. This want
>> work if i want to process some selected files. In contrast to this,
>> "os.popen() allows you to pass arguments like "ls *txt" to retrieve only
>> *.txt files.
> 
> Sorry, that's still not a good argument for two forks and god knows how
> any system calls.  Try this:
> 
>     import glob
>     txt_files = glob.glob("*txt")

In these days of 1.whatever GHz processors, I doubt that a
couple fork/exec combinations matters a lot in most situations.
But, os.system() calls the shell. The shell does god-knows-what
to the arguments, then looks god-knows-where for the
executable.  You can lessen these problems by specifying an
absolute path and quoting the arguments -- though quoting them
properly isn't a trivial problem.

Don't even ask what happens when the wrong shell gets chosen to
start with.  :)

Maybe I'm a bit too paranoid, but using os.system() seems to me
to be begging for problems down the road.  If you explicitly
want shell-command-line semantics then it's cool, but most of
the places I see it used (including in my code) there are more
robust solutions.

Modules to look in when you're tempted to do an os.system():

   shutil
   os.path
   glob
   os
   commands   

If all else fails, os.spawn or os.popen2 are often better
choices than os.system.

I'm done preaching now...

-- 
Grant Edwards                   grante             Yow!  Gibble, Gobble, we
                                  at               ACCEPT YOU...
                               visi.com            



More information about the Python-list mailing list