unexpected from/import statement behaviour
nisp
emanuele.nespolo at gmail.com
Thu Aug 28 02:39:56 EDT 2008
On Aug 27, 3:35 pm, Peter Otten <__pete... at web.de> wrote:
> nisp wrote:
> > 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.
>
> Read it again. If you have two modules
>
> module1.py
> from sys import stderr
>
> module2.py
> from module1 import stderr
>
> you get three names 'stderr' in three different namespaces, and each name
> may bind a different object.
>
>
>
> > 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
>
> This imports HelloWorld.stderr:
>
> > from HelloWorld import *
>
> You now have a global variable 'stderr' in module __main__, initialized to
> the same value as HelloWorld.stderr.
>
> > 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
>
> This rebinds sys.stderr and a local 'stderr' in main()
>
> > sys.stderr = stderr = StderrCatcher()
>
> but both HelloWorld.stderr and __main__.stderr are unaffected. What you need
> is
> import HelloWorld
> sys.stderr = HelloWorld.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 :-(
Hi Peter!
Definitely you are right ! May be this time I understood completely
the topic (or may be not ?... gosh !) ... I didn't considered well the
"from HelloWolrd import *" in mymodule.py.
Now my module is:
import sys
import HelloWorld
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
mystderr = sys.stderr = HelloWorld.stderr = StderrCatcher()
m = HelloWorld.Cheers()
m.doSomeStuff()
print >>sys.stderr, "mymodule prints something"
print "stderr: \n%s" % mystderr.data
if __name__ == '__main__':
main()
and its output is:
mymodule stderr: <open file '<stderr>', mode 'w' at 0xb7d2d0b0>
Cheers stderr <__main__.StderrCatcher instance at 0xb7cf4e4c>
stderr:
Here is my msg: Hello World !!
This is a nice day today !!
mymodule prints something
now it works perfectly !
Great ! Thanks to all of you !
Nisp
More information about the Python-list
mailing list