New submission from mythsmith: I found a condition where different behaviour could be observed depending on how a module is imported.
It seems to be different to write: import module # against: from package import module In the attachment you find a minimal package (imptest) with this organization: imptest |-> __init__.py (empty) |-> m.py (module which initializes a variable "foo=0") |- sub (package) |-> __init__.py (empty) |-> subm.py (module which, upon import, changes "m.foo=1") And two scripts which can be directly executed: |-> run0.py (using "import m") |-> run1.py (using "from imptest import m") Contents of the module m: ######################### foo=0 def do(): global foo foo=1 print('doing foo=',foo) print("imported foo=",foo) Contents of module subm: ####################### from imptest import m from imptest import m print("imported sub, foo=",m.foo) Both run0.py and run1.py imports module m and calls the do() function, thus theoretically changing foo to 1. Both later import the subm module, which in turn imports again the m module. What I would expect is that, since m is already in memory, it is not really imported again: so foo remains equal to 1 also after subm import. I found that this actually depends on how I imported m in the script. Contents of run0.py: #################### import m m.do() print("importing subm") from imptest.sub import subm Result: imported m; foo= 0 doing foo= 1 importing subm imported m; foo= 0 imported sub, foo= 0 As you can see from printout "importing subm", the m module is imported again and thus foo is reset to 0. In run1.py, I changed the line "import m" to "from imptest import m", and got the expected behaviour: Contents of run1.py: #################### from imptest import m m.do() print("importing subm") from imptest.sub import subm Result: imported m; foo= 0 doing foo= 1 importing subm imported sub, foo= 1 I know that directly running a module in the first level of a package may seem strange or not correct, but could someone explain why this is happening? I would expect a module to be loaded in memory at the first import and then referred in any way I later or elsewhere in the program choose to import it. ---------- components: Interpreter Core files: imptest.zip messages: 218901 nosy: mythsmith priority: normal severity: normal status: open title: Behaviour of modules depends on how they where imported type: behavior versions: Python 2.7, Python 3.2 Added file: http://bugs.python.org/file35314/imptest.zip _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue21553> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com