redirection in a file with os.system

T

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)
 
A

Arnaud Delobelle

TP said:
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

HTH
 
S

saju.pillai

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)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top