On Nov 4, 12:06 am, TP <[EMAIL PROTECTED]> 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) -- http://mail.python.org/mailman/listinfo/python-list