lordofcode wrote:
Hi All
Not an expert in Python, so sorry if this sounds like a silly
question.
I went through other few threads in the mailing list but they are not
helping me much.
I have run into a problem related to dynamically loading and unloading
a module.
I need to dynamically load a module and unload it and load another
module.
For example I have many files(All files in Python are modules right?)
like mobile_1.py ,mobile_2.py, mobile_3.py etc.. in my project folder
which contains classes and methods with same name but different
functionality.(am afraid I cannot change this structure as these files
are generated randomly by the user)
So initially when my program starts I have to load a default module. I
do this as follows:
##############################
MODULE_name = "mobile_1"
exec "from "+MODULE_name+" import *"
##############################
And use the methods defined in "mobile_1.py" file
Now as the application continues , I may have to use the methods
defined in "mobile_2.py" or "mobile_3.py" etc instead of the
previously loaded module,which I incorrectly try to do as below:
####################
MODULE_name = "mobile_2"
exec "from "+MODULE_name+" import *"
#####################
The above import does not have any impact and the methods called from
my application still pertain to mobile_1.py as its still in the
current namespace(?).
I tried below code with del(), reload() etc but could not figure it
out.
###Code to unload a dll####
del sys.modules[MODULE_name] #==> does not delete the reference in namespace
1)How do I unload a module dynamically and completely remove the
references in the module so a new module with same name references can
be loaded?
2)Are there any alternative way to do the above requirement?
Currently I am working around by restarting the whole initial setup
for each new module which is unnecessary waste.Can I avoid this
"reset"?
1/ Do not use from x import *
2/ How many modules would you like to import in the end ? If this number
is bound I would suggest to use a static approach:
import mod1
import mod2
import mod3
mod4 = __import__('mod4') # equivalent to import mod4
for mod in [mod1, mod2, mod3, mod4]:
# will call func1 on each modules
print "now using module %s functions " % mod.__file__
mod.func1()
mod.func2()
With this approach it's pretty much easy to call the correct
methods/attributes, as every symbols is scopped by module namespace. You
will have less hard time debugging your code.
3/ if you really need to unload the previous module, it's a little bit
tedious.
import mod1
del mod1
sys.modules['mod1'] = None # will unload mod1 assuming mod1 was the only
reference to that module.
But believe me, you don't want to mess up with the python import mechanism.
JM
--
http://mail.python.org/mailman/listinfo/python-list