On 12/23/2009 8:41 PM, 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
You probably shouldn't use "from module import *", use the __import__
function:
name = __import__('one')
name.foo() # defined in `one`
name = __import__('two')
name.bar() # defined in `two`
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(?).
that will just imports mobile_2's function into the current namespace,
possibly overriding the previously defined names from mobile_1 but it
won't delete anything that doesn't get overriden.
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"?
You can start a python subprocess for each new module you're loading.
That restarts the whole thing, but python loads fairly quickly and it
ensures that there won't be any leftover side effects caused by the
execution of the previous module.
--
http://mail.python.org/mailman/listinfo/python-list