import and shared global variables

M

Michael Brenner

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

Diez B. Roggisch

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
 
M

Michael Brenner

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
 
D

Diez B. Roggisch

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top