Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   redirection in a file with os.system (http://www.velocityreviews.com/forums/t642841-redirection-in-a-file-with-os-system.html)

TP 11-03-2008 07:06 PM

redirection in a file with os.system
 
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)

Arnaud Delobelle 11-03-2008 07:18 PM

Re: redirection in a file with os.system
 
TP <Tribulations@Paralleles.invalid> 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

saju.pillai@gmail.com 11-04-2008 05:58 AM

Re: redirection in a file with os.system
 
On Nov 4, 12:06*am, TP <Tribulati...@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)




All times are GMT. The time now is 09:36 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.