How to unimport a python module which is already imported?
How to unimport a python module which is already imported?
Theres no way to unload something once youve imported it. Python keeps a copy of the module in a cache, so the next time you import it it wont have to reload and reinitialize it again.
If all you need is to lose access to it, you can use del
:
import package
del package
Note that if you then reimport the package, the cached copy of the module will be used.
If you want to invalidate the cached copy of the module so that you can re-run the code on reimporting, you can use sys.modules.pop
instead as per @DeepSOICs answer.
If youve made a change to a package and you want to see the updates, you can reload
it. Note that this wont work in some cases, for example if the imported package also needs to reload a package it depends on. You should read the relevant documentation before relying on this.
For Python versions up to 2.7, reload
is a built-in function:
reload(package)
For Python versions 3.0 to 3.3 you can use imp.reload
:
import imp
imp.reload(package)
For Python versions 3.4 and up you can use importlib.reload
:
import importlib
importlib.reload(package)
When you import a module, Python looks if this module is in sys.modules dictionary. If not, it runs the module, and puts the resulting module object in sys.modules
.
So, to unimport a module, one might use
import sys
sys.modules.pop(your_module_name_here)
The next time it is imported, python will re-execute the module. However, in all other loaded modules that have imported the module, the old code will still be used, as they still hold the reference to the old module object. reload
function explained in other answers helps with that situation by updating the module object rather than creating a brand new one. But it doesnt help with from your_module import some_function
style of imports.
How to unimport a python module which is already imported?
While you shouldnt worry about unimporting a module in Python, you can normally just simply decrement the reference to the import
ed module or function using del
:
>>> import requests
>>> dir()
[__builtins__, __doc__, __name__, __package__, readline, requests, rlcompleter]
>>> del requests
>>> dir()
[__builtins__, __doc__, __name__, __package__, readline, rlcompleter]
>>>
Note that Id advise just not worrying about this as the overhead of an unused import is near trivial — traversing one extra entry in sys.modules
is nothing compared to the false security del some_module
will give you (consider if the __init__
does some setup or you ran from X import *
).
Related posts
- Is there a JavaScript equivalent of the Python pass statement that does nothing?
- python – How to let the user select an input from a finite list?
- exception handling – Python FileNotFound
- If range() is a generator in Python 3.3, why can I not call next() on a range?
- Run Python in Atom and take user input
- Python – Split string with space delimiter
- file – I need to write a Python script to sort pictures, how would I do this?
- bash: syntax error near unexpected token `( – Python