On Jan 10, 8:29 am, Tim <jtim.arn...@gmail.com> wrote:
> On Jan 7, 11:24 am, Tim <jtim.arn...@gmail.com> wrote:
>
>
>
>
>
> > hi, I'm using a 3rd-party python program that uses the python logging
> > facility and also makes calls to os.system. I'm trying to capture its
> > output to a file.
>
> > In my own code, I've taken control of the loggers that are setup in
> > the other program by removing its StreamHandler and replacing with
> > FileHander. But when it comes to the call to os.system I'm at a loss.
>
> > I want to capture the stdout from that os.system call in my
> > FileHandler. I thought this might work, before I call the other
> > program's class/method:
> > sys.stdout = getLogger('status').handlers[0].stream
>
> > but no dice. Is there any clean way to get what I want? If not, I
> > guess I'll override the other method with my own, but it will
> > basically be a bunch of code copied with os.sytem replaced with
> > subprocess, using getLogger('status').handlers[0].stream for stdout/
> > stderr.
>
> > thanks,
> > --Tim Arnold
>
> Replying to my own post....
>
> I think I may have included too much fluff in my original question.
> The main thing I wonder is whether I can attach a log handler to
> stdout in such a way that os.system calls will write to that handler
> instead of the console.

No, but you could replace os.system with something that does work.
(It would replace it globally for all uses, so you may need some logic
to decide whether to leave the call alone, or to modify it, perhaps by
inspecting the call stack.)

The simplest thing to do is to append a shell redirection to the
command (>/your/log/file), so something like this:

_real_os_system = os.system

def my_os_system(cmd):
    if test_log_condition:
        return _real_os_system(cmd + "2> /my/log/file")
    return _real_os_system(cmd)

os.system = my_os_system

That could backfire for any number of reasons so you probably should
only do this if you know that it works with all the commands it
issues.

The better way might be to call the subprocess module instead, where
you can dispatch the command with redirection to any stream.  I doubt
there's a foolproof way to do that given an arbitrary os.system
command, but the subprocess way is probably safer.


Carl Banks
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to