Python 模块搜索,加载和编译
模块搜索路径
加载模块时,解释器将会在sys.path中的路径下搜索该模块,在sys.path中的顺序决定了加载模块时的搜索顺序。
- 加载Python文件时,将其路径添加至sys.path中即可<
sys.path.append(Python文件的路径)
> - 也可加载.zip中的文件,如module.zip,使用
sys.path.append(module.zip路径/module.zip)
即可
模块加载和编译
使用import加载的模块可分为四类:
- 使用Python编写的代码,.py文件;
- 已被编译为库或DLL的C/C++扩展;
- 包含一组模块的包;
- 使用C编写并链接到Python解释器的内置模块;
查找模块时,解释器在sys.path下的每个目录搜索以下文件(按搜索顺序列出):
- 目录foo,它定义了一个包;
- foo.pyd, foo.so, foomodule.dll;
- foo.pyo
- foo.pyc
- foo.py
对于.py
文件,首次导入模块时,它将会被编译为字节码并作为.pyc
文件写回到磁盘。在后续的导入操作中,解释器将加载这段预编译的字节码,除非.py
文件做了更改(这种情况下重新生成.pyc
文件)。
只有使用了import语句才能将文件自动编译为.pyc和.pyo文件。
注意,.pyc
文件特定于某个Python的版本。因为某个Python版本生成的.pyc
文件可能不适用于其他的Python版本。
模块的重新加载和卸载
Python实际上不支持重新加载和卸载之前导入的模块。尽管可以从sys.modules删除模块,但这种方法通常不会从内存中卸载该模块。这是因为对该模块对象的引用可能不为零。
由于模块引用存在于多个位置,因此在更改了模块实现之后再重新加载该模块通常是行不通的。例如,从sys.modules中删除一个模块,然后使用import重新加载它,并不会追溯性地更改程序中以前对该模块的引用。
早期Python提供了reload()函数来重新加载模块,但是使用这个函数并不是真正安全的,而且不鼓励使用它。Python3完全删除了这一函数。所以,最好不要使用它。
简单来说就是Python实际上不支持重新加载和卸载之前导入的模块…
转载请标明出处,原文地址(http://blog.csdn.net/lis_12/article/details/53899083).
如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。