Problem with Dynamically unloading a module

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


Jean-Michel Pichavant wrote:
> 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
You may also want to look at the imp module, 
http://docs.python.org/library/imp.html
It could help you in your task.

JM



More information about the Python-list mailing list