Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > os.system and loggers

Reply
Thread Tools

os.system and loggers

 
 
Tim
Guest
Posts: n/a
 
      01-07-2011
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
 
Reply With Quote
 
 
 
 
Tim
Guest
Posts: n/a
 
      01-10-2011
On Jan 7, 11:24*am, Tim <(E-Mail Removed)> 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.

thanks,
--Tim
 
Reply With Quote
 
 
 
 
Carl Banks
Guest
Posts: n/a
 
      01-10-2011
On Jan 10, 8:29*am, Tim <(E-Mail Removed)> wrote:
> On Jan 7, 11:24*am, Tim <(E-Mail Removed)> 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
 
Reply With Quote
 
Carl Banks
Guest
Posts: n/a
 
      01-10-2011
On Jan 10, 8:29*am, Tim <(E-Mail Removed)> wrote:
> 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.

 
Reply With Quote
 
Tim
Guest
Posts: n/a
 
      01-11-2011
On Jan 10, 1:01*pm, Carl Banks <(E-Mail Removed)> wrote:
> On Jan 10, 8:29*am, Tim <(E-Mail Removed)> wrote:
>
>
>
>
>
>
>
>
>
> > On Jan 7, 11:24*am, Tim <(E-Mail Removed)> 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


Thanks Carl. I will use subprocess. I made this little toy example to
prove to myself that subprocess does handle a filehandler stream, so I
include it here for completeness' sake:

import subprocess,logging,shlex

# create the logger, filehandler and get the stream
log = logging.getLogger('mytest')
fh = logging.FileHandler('mytest.log')
log.addHandler(fh)
log.setLevel(logging.INFO)
mylog = logging.getLogger('mytest').handlers[0].stream

# write a test line to the log
log.info('my first line')

# execute the subprocess using the stream as stdout
cmd = 'ls -l'
p = subprocess.Popen(shlex.split(cmd),stdout=mylog)

# if you don't wait(), the output won't be necessarily in
chronological order.
r = p.wait()

# write a last test line to the log
log.info('done %s'% r)

and it works as expected.
thanks,
--Tim Arnold

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
dependency injection and loggers Tomer Java 14 01-05-2013 09:41 PM
Basic Question about Loggers, Parent Loggers, and Levels Rhino Java 8 04-30-2010 10:20 PM
Using Multiple Loggers for SimpleFormatter AND XML nico Java 3 01-19-2008 03:58 AM
Loggers and reloads Francois Bouffard Python 2 05-27-2004 04:22 AM
loggers with different handler properties Simo-Pekka Sadeluoto Java 0 07-08-2003 11:02 AM



Advertisments