Problem with Dynamically unloading a module

Jean-Michel Pichavant jeanmichel at sequans.com
Wed Dec 23 07:37:06 EST 2009


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



More information about the Python-list mailing list