Is there any way to unimport a library

Jean-Michel Pichavant jeanmichel at sequans.com
Mon Nov 21 08:08:34 EST 2011


Jean-Michel Pichavant wrote:
> Gelonida N wrote:
>> I wondered whether there is any way to un-import a library, such, that
>> it's occupied  memory and the related shared libraries are released.
>>
>>
>> My usecase is following:
>>
>>
>> success = False
>> try:
>>     import lib1_version1 as lib1
>>     import lib2_version1 as lib2
>>     success = True
>> except ImportError:
>>     pass
>> if not success:
>>     try:
>>         import lib1_version2 as lib1
>>         import lib2_version2 as lib2
>>         success = True
>>     except importError:
>>         pass
>> if not success:
>>     . . .
>>
>>
>>
>> Basically if I am not amble to import lib1_version1 AND lib2_version1,
>> then I wanted to make sure, that lib1_version1 does not waste any memory
>>
>>
>> At this moment this is more a thought excercise than a real issue, but I
>> thought that perhaps somebody encountered this kind of issue and had an
>> idea how to deal with such situations.
>>
>> One solution, that I could imagine is running the program a first time,
>> detect all existing libraries and write out a config file being use
>> the next time it is run, such, that immediately the right libs are 
>> imported.
>>
>>   
> Short answer for unimporting modules : Not possible (yes there is a 
> long one :o) ).
>
> One approach to your problem is to test for module existence before 
> importing any module.
>
> import imp
>
> def impVersion(version)
>    try:
>        imp.find_module('lib1_version%s' % version)
>        imp.find_module('lib2_version%s' % version)
>    except ImportError:
>        raise
>    else:
>        lib1 = __import__('lib1_version%s' % version)
>        lib2 = __import__('lib2_version%s' % version)
>
> # using a for loop to avoid to many nested try statement
> for version in [1,2,3,4]:
>    try:
>        impVersion(version)
>    except ImportError:
>        continue
>    break
>
> if not lib1 or not lib2:
>    # no lib imported
>    pass
>
> Using this code allows you to import your library only if all 
> conditions are met, preventing you from rolling back in case of error.
>
> Jean-Michel

there are missing
global lib1
global lib2
statements right before assigning lib1 and lib2.

JM



More information about the Python-list mailing list