os.system stdout redirection...

Discussion in 'Python' started by Terry Gray, Aug 17, 2003.

  1. Terry Gray

    Terry Gray Guest

    Using Python 2.2 in Debian linuxI am trying to change to a different
    directory, execute a 'make all' command, and redirect the output of the
    subshell to a PyQt window... I should be able to execute the
    os.system('cd newdirectory; make all'), but how do I redirect stdout of
    the new subshell created by the os.system call?

    Any help would be appreciated.

    twgray
    Terry Gray, Aug 17, 2003
    #1
    1. Advertising

  2. Terry Gray

    mackstann Guest

    On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray wrote:
    > Using Python 2.2 in Debian linuxI am trying to change to a different
    > directory, execute a 'make all' command, and redirect the output of the
    > subshell to a PyQt window... I should be able to execute the
    > os.system('cd newdirectory; make all'), but how do I redirect stdout of
    > the new subshell created by the os.system call?
    >
    > Any help would be appreciated.


    You can use os.popen (popen2 and 3 as well), or the popen2 module's
    Popen3 and 4 classes, or commands.getoutput (and there are probably even
    more ways :).

    --
    m a c k s t a n n mack @ incise.org http://incise.org
    While having never invented a sin, I'm trying to perfect several.
    mackstann, Aug 17, 2003
    #2
    1. Advertising

  3. Terry Gray

    Donn Cave Guest

    Re: os.system stdout redirection [to PyQt window]

    Quoth mackstann <>:
    | On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray wrote:
    |> Using Python 2.2 in Debian linuxI am trying to change to a different
    |> directory, execute a 'make all' command, and redirect the output of the
    |> subshell to a PyQt window... I should be able to execute the
    |> os.system('cd newdirectory; make all'), but how do I redirect stdout of
    |> the new subshell created by the os.system call?

    | You can use os.popen (popen2 and 3 as well), or the popen2 module's
    | Popen3 and 4 classes, or commands.getoutput (and there are probably even
    | more ways :).

    Yes, very good, there are many ways to redirect output, but you
    need to know how to make PyQt monitor a file and copy it to a window
    before it matters much either way.

    I don't know, so I've changed the subject line, replacing the elipsis
    ("..." - what was that for?) with [to PyQt window] to attract the
    attention of someone who might have a clue.

    Do you need to write this output line by line as it comes out of make?
    Or would it be fine to run make, and then wait to present all the output
    after it's finished? The latter is likely to be significantly easier.

    # make output goes to both units 1 and 2 (output and error/diagnostic)
    os.system('cd newdirectory; make all > make.log 2>&1')
    displayfile('newdirectory/make.log')

    Donn Cave,
    Donn Cave, Aug 17, 2003
    #3
  4. Terry Gray

    Terry Gray Guest

    Re: os.system stdout redirection [to PyQt window]

    Donn Cave wrote:
    > Quoth mackstann <>:
    > | On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray wrote:
    > |> Using Python 2.2 in Debian linuxI am trying to change to a different
    > |> directory, execute a 'make all' command, and redirect the output of the
    > |> subshell to a PyQt window... I should be able to execute the
    > |> os.system('cd newdirectory; make all'), but how do I redirect stdout of
    > |> the new subshell created by the os.system call?
    >
    > | You can use os.popen (popen2 and 3 as well), or the popen2 module's
    > | Popen3 and 4 classes, or commands.getoutput (and there are probably even
    > | more ways :).
    >
    > Yes, very good, there are many ways to redirect output, but you
    > need to know how to make PyQt monitor a file and copy it to a window
    > before it matters much either way.
    >
    > I don't know, so I've changed the subject line, replacing the elipsis
    > ("..." - what was that for?) with [to PyQt window] to attract the
    > attention of someone who might have a clue.
    >
    > Do you need to write this output line by line as it comes out of make?
    > Or would it be fine to run make, and then wait to present all the output
    > after it's finished? The latter is likely to be significantly easier.
    >
    > # make output goes to both units 1 and 2 (output and error/diagnostic)
    > os.system('cd newdirectory; make all > make.log 2>&1')
    > displayfile('newdirectory/make.log')
    >
    > Donn Cave,

    I need to display make's output line by line, since it a very long
    compile cycle (kernel compile). Thanks for the help.
    Terry Gray, Aug 17, 2003
    #4
  5. Terry Gray

    Terry Gray Guest

    mackstann wrote:
    > On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray wrote:
    >
    >>Using Python 2.2 in Debian linuxI am trying to change to a different
    >>directory, execute a 'make all' command, and redirect the output of the
    >>subshell to a PyQt window... I should be able to execute the
    >>os.system('cd newdirectory; make all'), but how do I redirect stdout of
    >>the new subshell created by the os.system call?
    >>
    >>Any help would be appreciated.

    >
    >
    > You can use os.popen (popen2 and 3 as well), or the popen2 module's
    > Popen3 and 4 classes, or commands.getoutput (and there are probably even
    > more ways :).
    >

    All the Python docs I've been looking at must have been pre-2.0, because
    this is the first I've heard of the popen2/3/Popen3/4 calls. Anyway, is
    there a recommended way of capturing 'make's' output, line by line, and
    redirecting it to a PyQt window? The window in question is a QTextEdit
    control with a 'def write' function.

    Again, thanks for the help.
    Terry Gray, Aug 17, 2003
    #5
  6. Terry Gray

    mackstann Guest

    On Sun, Aug 17, 2003 at 02:43:44PM -0500, Terry Gray wrote:
    > mackstann wrote:
    > >On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray wrote:


    > >You can use os.popen (popen2 and 3 as well), or the popen2 module's
    > >Popen3 and 4 classes, or commands.getoutput (and there are probably even
    > >more ways :).
    > >

    > All the Python docs I've been looking at must have been pre-2.0, because
    > this is the first I've heard of the popen2/3/Popen3/4 calls. Anyway, is
    > there a recommended way of capturing 'make's' output, line by line, and
    > redirecting it to a PyQt window? The window in question is a QTextEdit
    > control with a 'def write' function.
    >
    > Again, thanks for the help.


    Probably the simplest way is something like:

    import os
    prog = os.popen("echo hello")
    print prog.read()

    --> 'hello\n'

    It's basically a file-like interface for running shell commands. You
    can also open with "w" or "rw" and write to the command's stdin, or you
    can use popen2/3/4 to have individual descriptors for stdin / stdout /
    stderr. The popen2 module seems to be less cross-platform, at least
    with regard to the Popen3/4 classes, as I see this in popen2.py:

    if sys.platform[:3] == "win":
    # Some things don't make sense on non-Unix platforms.
    del Popen3, Popen4

    But if you plan on only using unix, then Popen3/4 are kinda nice, if you
    like a more OOPey interface, or want more process management abilities.
    Example:

    import popen2
    prog = popen2.Popen3("echo hello; read i; echo $i")
    print prog.fromchild.read()

    --> 'hello\n'

    There's also .tochild, to write to its stdin, and Popen4 has childerr,
    for reading stderr. You can also do prog.poll() and prog.wait(), if you
    need to check if it's still running, or wait for it to exit, and you can
    get its pid via prog.pid.

    So it kinda depends on whether you need to read from the command as
    you're doing something else, or you want to just wait for it all to come
    out at once.

    import popen2

    prog = popen2.Popen3("make spaghetti 2>&1")
    output = ""

    while 1:
    text = prog.read()
    if text:
    output += text

    At least, I'm pretty sure that's how you detect that the program is done
    (reading ''). I've only used Popen3 to interface with mpg321, and it
    sends a little quit message when it's done, and then I close it, so I
    haven't had to check for when it exits.

    If you need to read bits from it while you're simultaneously doing other
    things, you can use prog.fromchild.fileno() with select.select(), for
    example. Or launch a thread, or other things I'm sure.

    --
    m a c k s t a n n mack @ incise.org http://incise.org
    My weight is perfect for my height -- which varies
    mackstann, Aug 17, 2003
    #6
  7. Terry Gray

    Terry Gray Guest

    mackstann wrote:
    > On Sun, Aug 17, 2003 at 02:43:44PM -0500, Terry Gray wrote:
    >
    >>mackstann wrote:
    >>
    >>>On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray wrote:

    >
    >
    >>>You can use os.popen (popen2 and 3 as well), or the popen2 module's
    >>>Popen3 and 4 classes, or commands.getoutput (and there are probably even
    >>>more ways :).
    >>>

    >>
    >>All the Python docs I've been looking at must have been pre-2.0, because
    >>this is the first I've heard of the popen2/3/Popen3/4 calls. Anyway, is
    >>there a recommended way of capturing 'make's' output, line by line, and
    >>redirecting it to a PyQt window? The window in question is a QTextEdit
    >>control with a 'def write' function.
    >>
    >>Again, thanks for the help.

    >
    >
    > Probably the simplest way is something like:
    >
    > import os
    > prog = os.popen("echo hello")
    > print prog.read()
    >
    > --> 'hello\n'
    >
    > It's basically a file-like interface for running shell commands. You
    > can also open with "w" or "rw" and write to the command's stdin, or you
    > can use popen2/3/4 to have individual descriptors for stdin / stdout /
    > stderr. The popen2 module seems to be less cross-platform, at least
    > with regard to the Popen3/4 classes, as I see this in popen2.py:
    >
    > if sys.platform[:3] == "win":
    > # Some things don't make sense on non-Unix platforms.
    > del Popen3, Popen4
    >
    > But if you plan on only using unix, then Popen3/4 are kinda nice, if you
    > like a more OOPey interface, or want more process management abilities.
    > Example:
    >
    > import popen2
    > prog = popen2.Popen3("echo hello; read i; echo $i")
    > print prog.fromchild.read()
    >
    > --> 'hello\n'
    >
    > There's also .tochild, to write to its stdin, and Popen4 has childerr,
    > for reading stderr. You can also do prog.poll() and prog.wait(), if you
    > need to check if it's still running, or wait for it to exit, and you can
    > get its pid via prog.pid.
    >
    > So it kinda depends on whether you need to read from the command as
    > you're doing something else, or you want to just wait for it all to come
    > out at once.
    >
    > import popen2
    >
    > prog = popen2.Popen3("make spaghetti 2>&1")
    > output = ""
    >
    > while 1:
    > text = prog.read()
    > if text:
    > output += text
    >
    > At least, I'm pretty sure that's how you detect that the program is done
    > (reading ''). I've only used Popen3 to interface with mpg321, and it
    > sends a little quit message when it's done, and then I close it, so I
    > haven't had to check for when it exits.
    >
    > If you need to read bits from it while you're simultaneously doing other
    > things, you can use prog.fromchild.fileno() with select.select(), for
    > example. Or launch a thread, or other things I'm sure.
    >

    Many thanks. That about covers all I needed.
    Terry Gray, Aug 17, 2003
    #7
  8. Terry Gray

    Terry Gray Guest

    Erwin S. Andreasen wrote:
    > Terry Gray <> writes:
    >
    >
    >>Using Python 2.2 in Debian linuxI am trying to change to a different
    >>directory, execute a 'make all' command, and redirect the output of
    >>the subshell to a PyQt window... I should be able to execute the
    >>os.system('cd newdirectory; make all'), but how do I redirect stdout
    >>of the new subshell created by the os.system call?

    >
    >
    > If you are going to use QT, Use QProcess. You can set it up to fire
    > off a signal when new output has arrived and then read it and update
    > your window.
    >
    >

    Thanks, exactly what I was looking for.
    Terry Gray, Aug 19, 2003
    #8
  9. Terry Gray

    baiste Guest

    Originally posted by Mackstann

    > On Sun, Aug 17, 2003 at 02:43:44PM -0500, Terry Gray wrote:


    > > mackstann wrote:


    > > >On Sun, Aug 17, 2003 at 01:01:41AM -0500, Terry Gray

    > wrote:


    >


    > > >You can use os.popen (popen2 and 3 as well), or the popen2

    > module's


    > > >Popen3 and 4 classes, or commands.getoutput (and there are

    > probably even


    > > >more ways :).


    > > >


    > > All the Python docs I've been looking at must have been pre-2.0,

    > because


    > > this is the first I've heard of the popen2/3/Popen3/4 calls.

    > Anyway, is


    > > there a recommended way of capturing 'make's' output, line by

    > line, and


    > > redirecting it to a PyQt window? The window in question is a

    > QTextEdit


    > > control with a 'def write' function.


    > >


    > > Again, thanks for the help.


    >


    > Probably the simplest way is something like:


    >


    > import os


    > prog = os.popen("echo hello")


    > print prog.read()


    >


    > --> 'hello\n'


    >


    > It's basically a file-like interface for running shell commands. You


    > can also open with "w" or "rw" and write to the command's
    > stdin, or you


    > can use popen2/3/4 to have individual descriptors for stdin / stdout /


    > stderr. The popen2 module seems to be less cross-platform, at least


    > with regard to the Popen3/4 classes, as I see this in popen2.py:


    >


    > if sys.platform[:3] == "win":


    > # Some things don't make sense on non-Unix platforms.


    > del Popen3, Popen4


    >


    > But if you plan on only using unix, then Popen3/4 are kinda
    > nice, if you


    > like a more OOPey interface, or want more process management
    > abilities.


    > Example:


    >


    > import popen2


    > prog = popen2.Popen3("echo hello; read i; echo $i")


    > print prog.fromchild.read()


    >


    > --> 'hello\n'


    >


    > There's also .tochild, to write to its stdin, and Popen4 has childerr,


    > for reading stderr. You can also do prog.poll() and
    > prog.wait(), if you


    > need to check if it's still running, or wait for it to exit,
    > and you can


    > get its pid via prog.pid.


    >


    > So it kinda depends on whether you need to read from the command as


    > you're doing something else, or you want to just wait for it
    > all to come


    > out at once.


    >


    > import popen2


    >


    > prog = popen2.Popen3("make spaghetti 2>&1")


    > output = ""


    >


    > while 1:


    > text = prog.read()


    > if text:


    > output += text


    >


    > At least, I'm pretty sure that's how you detect that the
    > program is done


    > (reading ''). I've only used Popen3 to interface with mpg321, and it


    > sends a little quit message when it's done, and then I close it, so I


    > haven't had to check for when it exits.


    >


    > If you need to read bits from it while you're simultaneously
    > doing other


    > things, you can use prog.fromchild.fileno() with select.select(), for


    > example. Or launch a thread, or other things I'm sure.


    >


    > --


    > m a c k s t a n n mack @ incise.org
    > http://incise.org/http://incise.org


    > My weight is perfect for my height -- which varies




    hi mackstann, hi everybody,



    i hope i'm doing the right thing posting into this thread with that
    little different topic, but i googled here and everything here seems
    quite close to my problem:

    i tried to use the ideas and code posted in this thread to control
    mpg321. i send the 'LOAD' message to mpg321 via prog.write() but it
    refuses to play audio until the whole script is finished or arborted
    i.e. due to an error.

    on top of that, the script gets stuck at the 'read()' statement wich i
    try to use for fetching mpg321's feedback (current frame, end of file,
    etc). here's the code:



    prog = popen2.Popen3("mpg321 -R dummyargument")



    prog.tochild.write('LOAD test.mp3\n')



    print prog.fromchild.read()





    mackstann, you said you were using popen to control mpg321. please tell
    me how i can get it done...?





    thanks for your time

    baiste


    --
    Posted via http://dbforums.com
    baiste, Oct 11, 2003
    #9
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Acaccia

    stdout redirection

    Acaccia, Jan 16, 2004, in forum: C++
    Replies:
    3
    Views:
    11,920
    Acaccia
    Jan 16, 2004
  2. Joel Wagner

    Redirection of stdout fails on Windows

    Joel Wagner, Oct 9, 2003, in forum: Python
    Replies:
    1
    Views:
    774
    Daniel Dittmar
    Oct 10, 2003
  3. Jeff Epler

    Re: sys.stdout redirection

    Jeff Epler, Jul 19, 2004, in forum: Python
    Replies:
    0
    Views:
    435
    Jeff Epler
    Jul 19, 2004
  4. Holger Joukl

    Re: sys.stdout redirection

    Holger Joukl, Jul 19, 2004, in forum: Python
    Replies:
    0
    Views:
    447
    Holger Joukl
    Jul 19, 2004
  5. Derek Basch
    Replies:
    2
    Views:
    1,291
    Donn Cave
    Jan 21, 2005
Loading...

Share This Page