Unexpected side-effects of assigning to sys.modules[__name__]

Jean-Michel Pichavant jeanmichel at sequans.com
Thu Aug 6 20:01:42 CEST 2009


Steven D'Aprano wrote:
> Given this module:
>
> #funny.py
> import sys
> print "Before:"
> print "  __name__ =", __name__
> print "  sys.modules[__name__] =", sys.modules[__name__]
> sys.modules[__name__] = 123
> print "After:"
> print "  __name__ =", __name__
> print "  sys =", sys
>
>
> when I run it I get these results:
>
>
> [steve at sylar python]$ python2.6 funny.py
> Before:
>   __name__ = __main__
>   sys.modules[__name__] = <module '__main__' from 'funny.py'>
> After:
>   __name__ = None
>   sys = None
>
>
>
> I'm completely perplexed by this behaviour. sys.modules() seems to be a 
> regular dict, at least according to type(), and yet assigning to an item 
> of it seems to have unexpected, and rather weird, side-effects.
>
> What am I missing?
>
>
>
>   
Maybe when you assign 123 to sys.modules[__name__], you've removed the 
last reference on <module '__main__' from 'funny.py'> and it is 
garbaged. You are then loosing all your initial namespace.


try this one:
#funny.py
import sys
print "Before:"
print "  __name__ =", __name__
print "  sys.modules[__name__] =", sys.modules[__name__]
foo = sys.modules[__name__] # backup ref for the garbage collector
sys.modules[__name__] = 123
print "After:"
print "  __name__ =", __name__
print "  sys =", sys

Jean-Michel





More information about the Python-list mailing list