execl() and inheritied streams

E

Erik Johnson

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
 
D

Donn Cave

"Erik Johnson said:
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, (e-mail address removed)
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,054
Latest member
LucyCarper

Latest Threads

Top