Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > redirection in a file with os.system

Reply
Thread Tools

redirection in a file with os.system

 
 
TP
Guest
Posts: n/a
 
      11-03-2008
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()

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)
 
Reply With Quote
 
 
 
 
Arnaud Delobelle
Guest
Posts: n/a
 
      11-03-2008
TP <(E-Mail Removed)> writes:

> 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()
>
> 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")?


Do you have to use low level os functions? Why not use the subprocess
module? E.g

>>> subprocess.call('ls', stdout=open('toto', 'w')


HTH

--
Arnaud
 
Reply With Quote
 
 
 
 
saju.pillai@gmail.com
Guest
Posts: n/a
 
      11-04-2008
On Nov 4, 12:06*am, TP <(E-Mail Removed)> 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)


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
File System Redirection Windows x 64 box. Rohit Srivastava Python 2 05-15-2009 01:02 PM
file redirection paul_0403@yahoo.com Perl Misc 3 10-27-2008 07:49 PM
detecting EOF using cin with file redirection iaesun@yahoo.com C Programming 7 08-02-2006 05:17 AM
File Download and page redirection from one click James T Kirk Javascript 2 08-21-2003 01:36 PM
exit! affects stdout redirection to a file Gennady Ruby 0 06-27-2003 11:41 PM



Advertisments