By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,141 Members | 1,232 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,141 IT Pros & Developers. It's quick & easy.

execl() and inheritied streams

P: n/a
Hi,

I am trying to use Python to remap stdout and stderr to a log file for
an exec()'ed program.
The following code seems to work fine for the script itself, but my
expectation was that the exec'ed program would inherit its STDIN and STDOUT
and so would be printing to the log file also. Unfortunately, that is not
the case: the print statements in the spawned process come back to the
screen. So... I'm a little puzzled and am not finding information on how to
remap the file descriptors other than to set sys.stdin, sys.stdout,
sys.stderr.

Here's my test:
ej@sand:~/src/python> cat exec.py
#! /usr/bin/python

import os, sys

fd = file('out.txt', 'a')
sys.stdout = fd
sys.stderr = fd

print "about to call exec..." # end up in out.txt as expected
sys.stdout.flush() # provided you do this (otherwise it won't)

os.execl('print123', 'ignored')
ej@sand:~/src/python> cat print123
#! /usr/bin/python
import sys
print "one"
print "two"
print "three"
sys.stdout.flush()
ej@sand:~/src/python> rm out.txt
ej@sand:~/src/python> ./exec.py
one
two
three
ej@sand:~/src/python> cat out.txt
about to call exec...
ej@sand:~/src/python>
So... can someone explain how to permenently change the file descriptors
that get inherited or otherwise explain what I'm doing wrong? Thanks for
taking the time to read my post. :)

-ej
Jul 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
In article <41********@nntp.zianet.com>,
"Erik Johnson" <ej <at> wellkeeper <dot> com> wrote:
I am trying to use Python to remap stdout and stderr to a log file for
an exec()'ed program.
The following code seems to work fine for the script itself, but my
expectation was that the exec'ed program would inherit its STDIN and STDOUT
and so would be printing to the log file also. Unfortunately, that is not
the case: the print statements in the spawned process come back to the
screen. So... I'm a little puzzled and am not finding information on how to
remap the file descriptors other than to set sys.stdin, sys.stdout,
sys.stderr.


sys.stdin etc. are objects that live in the Python interpreter.
Basically, they're a buffer plus a file descriptor, plus some
functions. Similar to the C stdio FILE object, which in fact
is underneath the Python fileobject.

Objects in interpreter memory space do not survive an exec.
You want to remap the standard UNIX file descriptors 0 (input),
1 (output) and 2 (error). They are the system level I/O streams
that will survive exec.

Like,
fd = os.open(filename, os.O_WRONLY|os.O_CREAT)
os.dup2(fd, 1)
os.dup2(fd, 2)
os.close(fd)

os.execve(...

Donn Cave, do**@u.washington.edu
Jul 18 '05 #2

P: n/a

Thanks for your kind and helpful reply, Donn! :)

-ej

"Donn Cave" <do**@u.washington.edu> wrote in message
news:do************************@gnus01.u.washingto n.edu...
sys.stdin etc. are objects that live in the Python interpreter.
Basically, they're a buffer plus a file descriptor, plus some
functions. Similar to the C stdio FILE object, which in fact
is underneath the Python fileobject.

Objects in interpreter memory space do not survive an exec.
You want to remap the standard UNIX file descriptors 0 (input),
1 (output) and 2 (error). They are the system level I/O streams
that will survive exec.

Like,
fd = os.open(filename, os.O_WRONLY|os.O_CREAT)
os.dup2(fd, 1)
os.dup2(fd, 2)
os.close(fd)

os.execve(...

Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.