469,603 Members | 2,121 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,603 developers. It's quick & easy.

import and shared global variables

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
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]

Mar 10 '06 #1
3 2050
> 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.


Yes, you are missing that your first glob is in __main__.glob, _not_ in
m1.glob.

To make that happen, use something like this:

glob = [1]
def main():
pass

if __name__ == "__main__":
import m1
m1.main()
Diez
Mar 10 '06 #2
Ah, thanks everybody! I had thought that, although the name was set to
"__main__", the module that was stored in sys.modules was m1
nevertheless, not a copy.
Well, having to write "import m1" inside m1.py seems a bit peculiar -
it's probably nicer to keep the "__main__" module free from stuff that
has to be imported by others. Would a module global.py (defining glob
and imported by whoever needs it) be more pythonic? (I didn't want to do
that because I really want to resist the temptation of introducing
glob1, glob2, glob3...)

michael
To make that happen, use something like this:

glob = [1]
def main():
pass

if __name__ == "__main__":
import m1
m1.main()
Diez


Mar 10 '06 #3
> has to be imported by others. Would a module global.py (defining glob
and imported by whoever needs it) be more pythonic?
I'd say yes.
(I didn't want to do
that because I really want to resist the temptation of introducing
glob1, glob2, glob3...)


I miss seeing what that has to do with creating a special module.

Diez
Mar 11 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Dan Williams | last post: by
1 post views Thread by Imran Aziz | last post: by
15 posts views Thread by Rob Nicholson | last post: by
8 posts views Thread by Mark Kamoski | last post: by
1 post views Thread by Darin | last post: by
reply views Thread by Michael Brenner | last post: by
3 posts views Thread by ankugoe7 | last post: by
reply views Thread by guiromero | last post: by
reply views Thread by devrayhaan | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.