En Mon, 08 Sep 2008 05:37:24 -0300, Rafe <[EMAIL PROTECTED]> escribió:
I've tried to use reload with a very simple algorithm. Simply run
through every imported module, ignoring anything that is "None" or on
the C: drive (all of our python is on a network drive so this hack
works for me for now) and reload() it. I've come to realize that this
isn't near intelligent enough to handle sub-packages.
Package Structure:
---------------------------
inheritRepro
__init__.py
baseLib.py
child
__init__.py
To summarize your code: inheritRepro.__init__.py only contains the reload
support; baselib is an independent module; child/__init__.py imports and
uses baseLib.
# Iterate over all IMPORTED modules
modules = sys.modules
for modName in modules:
mod = modules[modName]
(note: sys.modules could change along the iteration; I'd iterate this way
instead)
modules = sys.modules
for modName in modules.keys():
mod = modules.get(modName)
Output:
Reloading Python Modules...
Reloaded <module 'inheritRepro' from
'C:\TEMP\problema_con_reload\inheritRepro\_
_init__.pyc'>
Reloaded <module 'inheritRepro.child' from
'C:\TEMP\problema_con_reload\inheritR
epro\child\__init__.pyc'>
Reloaded <module 'inheritRepro.baseLib' from
'C:\TEMP\problema_con_reload\inheri
tRepro\baseLib.pyc'>
Note that child is reloaded *before* baseLib - when child imports baseLib,
it still finds the old module. One should reload baseLib before reloading
child, in that case it works fine.
This dependency between modules, applied to all modules in your project,
defines a "dependency graph". In some cases, one can define a partial
ordering of its nodes, such that no module depends on any other module
*after* it (it may depend only on modules *before* it). Look for
"topological sort".
Doing that in the generic case is not easy. If you *know* your
dependencies, reload the modules in the right order by hand.
NOTE: this works if I don't use a sub-package for 'child' (child.py
instead). Is it overly simple to assume reloading by file structure
might work?
You're iterating over sys.modules in whatever ordering the keys are in the
dictionary; using other module names may yield the "right" ordering just
by chance.
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list