redirection in a file with os.system

saju.pillai at gmail.com saju.pillai at gmail.com
Tue Nov 4 00:58:49 EST 2008


On Nov 4, 12:06 am, TP <Tribulati... at Paralleles.invalid> wrote:
> Hi everybody,
>
> The following code does not redirect the output of os.system("ls") in a
> file:
>
> import sys, os
> saveout = sys.stdout
> fd = open( 'toto', 'w' )
> sys.stdout = fd
> os.system( "ls" )
> sys.stdout = saveout
> fd.close()

os.system() will call the libc system() which should fork() and exec()
the '/bin/sh' shell with your command. The shell will inherit python's
file descriptors. sys.stdout is a python level object, not a process
level descriptor. By swapping sys.stdout with another file object you
have only changed a python level file object. In the second snippet
you have correctly updated the underlying process level descriptors.

I imagine a "print" statement just after the "sys.stdout = fd" will
not go to your stdout but the 'toto' file.

-srp



>
> Whereas the following works:
>
> old_stdout = os.dup( sys.stdout.fileno() )
> fd = os.open( 'bar', os.O_CREAT | os.O_WRONLY )
> os.dup2( fd, sys.stdout.fileno() )
> os.system( "ls" )
> os.close( fd )
> os.dup2( old_stdout, sys.stdout.fileno() )
>
> Why?
>
> I have another question: with this last code using os.open, the problem is
> that the file 'bar' is not removed before being written. So, it could lead
> to errors: the file 'bar' is overwritten, but extra lines from previous
> executions could remain.
> Am I compelled to use os.unlink (or os.remove) before calling
> os.system("ls")?
>
> Thanks
>
> Julien
>
> --
> python -c "print ''.join([chr(154 - ord(c)) for c in '*9(9&(18%.9&1+,\'Z
> (55l4('])"
>
> "When a distinguished but elderly scientist states that something is
> possible, he is almost certainly right. When he states that something is
> impossible, he is very probably wrong." (first law of AC Clarke)




More information about the Python-list mailing list