By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,587 Members | 1,575 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,587 IT Pros & Developers. It's quick & easy.

redirection in a file with os.system

P: n/a
TP
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)
Nov 3 '08 #1
Share this Question
Share on Google+
2 Replies


P: n/a
TP <Tr**********@Paralleles.invalidwrites:
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
Nov 3 '08 #2

P: n/a
On Nov 4, 12:06*am, TP <Tribulati...@Paralleles.invalidwrote:
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)
Nov 4 '08 #3

This discussion thread is closed

Replies have been disabled for this discussion.