469,285 Members | 2,561 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,285 developers. It's quick & easy.

os.system stdout redirection...

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

Jul 18 '05 #1
8 14564
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.

Jul 18 '05 #2
Quoth mackstann <ma**@incise.org>:
| 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, do**@drizzle.com
Jul 18 '05 #3
Donn Cave wrote:
Quoth mackstann <ma**@incise.org>:
| 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, do**@drizzle.com

I need to display make's output line by line, since it a very long
compile cycle (kernel compile). Thanks for the help.

Jul 18 '05 #4
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.

Jul 18 '05 #5
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

Jul 18 '05 #6
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.

Jul 18 '05 #7
Erwin S. Andreasen wrote:
Terry Gray <tg***@cox-internet.com> 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.

Jul 18 '05 #8

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
Jul 18 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by Wes S. | last post: by
4 posts views Thread by NewYorker | last post: by
20 posts views Thread by SR | last post: by
2 posts views Thread by Nadav | last post: by
18 posts views Thread by v4vijayakumar | last post: by
1 post views Thread by =?Utf-8?B?UmF5IE1pdGNoZWxs?= | last post: by
6 posts views Thread by stanleyxu | last post: by
reply views Thread by Tom Gaudasinski | last post: by
2 posts views Thread by TP | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.