7.3 Python 模块搜索,加载和编译

Python 模块搜索,加载和编译

模块搜索路径

加载模块时,解释器将会在sys.path中的路径下搜索该模块,在sys.path中的顺序决定了加载模块时的搜索顺序。

  1. 加载Python文件时,将其路径添加至sys.path中即可<sys.path.append(Python文件的路径)>
  2. 也可加载.zip中的文件,如module.zip,使用sys.path.append(module.zip路径/module.zip)即可

模块加载和编译

使用import加载的模块可分为四类:

  1. 使用Python编写的代码,.py文件;
  2. 已被编译为库或DLL的C/C++扩展;
  3. 包含一组模块的包;
  4. 使用C编写并链接到Python解释器的内置模块;

查找模块时,解释器在sys.path下的每个目录搜索以下文件(按搜索顺序列出):

  1. 目录foo,它定义了一个包;
  2. foo.pyd, foo.so, foomodule.dll;
  3. foo.pyo
  4. foo.pyc
  5. 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).

如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值