redirection in a file with os.system

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • TP

    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.file no() )
    fd = os.open( 'bar', os.O_CREAT | os.O_WRONLY )
    os.dup2( fd, sys.stdout.file no() )
    os.system( "ls" )
    os.close( fd )
    os.dup2( old_stdout, sys.stdout.file no() )

    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

    #2
    Re: redirection in a file with os.system

    TP <Tribulations@P aralleles.inval idwrites:
    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.file no() )
    fd = os.open( 'bar', os.O_CREAT | os.O_WRONLY )
    os.dup2( fd, sys.stdout.file no() )
    os.system( "ls" )
    os.close( fd )
    os.dup2( old_stdout, sys.stdout.file no() )
    >
    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.ca ll('ls', stdout=open('to to', 'w')
    HTH

    --
    Arnaud

    Comment

    • saju.pillai@gmail.com

      #3
      Re: redirection in a file with os.system

      On Nov 4, 12:06 am, TP <Tribulati...@P aralleles.inval idwrote:
      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.file no() )
      fd = os.open( 'bar', os.O_CREAT | os.O_WRONLY )
      os.dup2( fd, sys.stdout.file no() )
      os.system( "ls" )
      os.close( fd )
      os.dup2( old_stdout, sys.stdout.file no() )
      >
      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)

      Comment

      Working...