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