Michael Brenner wrote: > Hi, > > I'm implementing a plugin-based program, structured like the example > below (where m1 in the main module, loading m2 as a plugin). I wanted > to use a single global variable (m1.glob in the example) to store some > config data that the plugins can access. However, the output shown > belown seems to imply that glob is *copied* or recreated during the > import in m2. Am I missing something? I thought m1 should be in > sys.modules and not be recreated during the import in m2. > > After browsing c.l.p, it seems that this is probably somehow due to the > circular import. However, I do not really see why this should be a > problem here. Interestingly, the problem disappears when I put the code > in m1 in a real main() function instead of "if __name__" etc. Though > this seems to solve my problem, I still want to understand what's
What happens here is that there does end up being two copies of m1: the one named __main__ and the one imported as m1. If you think about this, there has to be two copies -- otherwise how could sometimes __name__ be __main__ and sometimes not. Anyway, there are several options. The simplest one here is not to modify anything locally from __main__ block. Instead import m1, and modify that copy. That is: glob = [1] if __name__ == "__main__": import m1 m1.glob.append(2) print "m1.main().1:", m1.glob m2 = __import__("m2") m2.test() print "m1.main().2:", glob Regards, -tim > happening. > > Thanks, > > michael > > > m1.py: > ------ > glob = [1] > if __name__ == "__main__": > glob.append(2) > print "m1.main().1:", glob > m2 = __import__("m2") > m2.test() > print "m1.main().2:", glob > ------ > > m2.py: > ------ > def test(): > import m1 > print "m2.test():", m1.glob > ----- > > Output: > m1.main().1: [1, 2] > m2.test(): [1] > m1.main().2: [1, 2] -- http://mail.python.org/mailman/listinfo/python-list