unexpected from/import statement behaviour

nisp emanuele.nespolo at gmail.com
Wed Aug 27 12:20:47 CEST 2008


On Aug 27, 9:56 am, Peter Otten <__pete... at web.de> wrote:
> nisp wrote:
> > Hi all !
>
> > I'm trying to capture stderr of an external module I use in my python
> > program. I'm doing this
> > by setting up a class in my module overwriting the stderr file object
> > method write.
> > The external module outputs to stderr this way:
>
> > from sys import std err
>
> > ....
>
> > print >> stderr, "Some text"
>
> > While in my module I use
>
> > import sys
>
> > ..... sys.stderr ... sys.stdout
>
> > Well, as long as I do not change in the external module those from/
> > import statements to just
>
> > import sys
>
> > ....
>
> > print >> sys.stderr, "Some text"
>
> > I'm not able to capture its stderr and of course I would like not to
> > do this kind of change.
> > I've always been convinced of the equivalence of the two ways of using
> > the import statement
> > but it's clear I'm wrong :-(
>
> > Please, someone can tell me what's going on ?
>
> > Thanks in advance !
>
> A practical approach to complement Diez' link to the explanation:
>
> Instead of modifying the external module you can either redirect stderr
> before you import the external module
>
> import sys
> sys.stderr = whatever
> import external
>
> or monkey-patch:
>
> import sys
> import external
>
> sys.stderr = external.sterr = whatever
>
> Peter

Hi all !

Thanks first of all ! I read the interesting Diez's link but something
still remains to me unclear, on the other hand it's clear the my
problem is concentrated there and on symbols.
Here is what I'm trying to do

HelloWorld.py: this is a real simplification of my external module
though still reflecting its structure (commented out is the version
that, let's say, works)

from sys import stderr
#import sys

class Cheers:
	def __init__(self):
		self.cheersMsg = 'Hello World !!'
		print "Cheers stderr %s" % stderr
		#print "Cheers stderr %s" % sys.stderr
	def _putCheers(self):
		print>>stderr, 'Here is my msg:', self.cheersMsg
		print>>stderr, 'This is a nice day today !!'
		#print>>sys.stderr, 'Here is my msg:', self.cheersMsg
		#print>>sys.stderr, 'This is a nice day today !!'
	def doSomeStuff(self):
		self._putCheers()

And below there is the module that uses the above one (mymodule.py):

#!/usr/bin/python

import sys
from HelloWorld import *

class StderrCatcher:
	def __init__(self):
		self.data = ''
	def write(self,stuff):
		self.data = self.data + "\t" + stuff


def main():

	print "mymodule stderr: %s" % sys.stderr

	sys.stderr = stderr = StderrCatcher()
	m = Cheers()
	m.doSomeStuff()
	print "stderr: \n%s" % sys.stderr.data

if __name__ == '__main__':
    main()


Below there is the output when it doesn't work:

mymodule stderr: <open file '<stderr>', mode 'w' at 0xb7d160b0>
Cheers stderr <open file '<stderr>', mode 'w' at 0xb7d160b0>
Here is my msg: Hello World !!
This is a nice day today !!
stderr:

And here when it works:

mymodule stderr: <open file '<stderr>', mode 'w' at 0xb7dc40b0>
Cheers stderr <__main__.StderrCatcher instance at 0xb7d8bd4c>
stderr:
        Here is my msg:         Hello World !!
        This is a nice day today !!


Thanks again!

PS Sorry for having probably replied to somone of you directly :-(



More information about the Python-list mailing list