Python/模块

维基教科书,自由的教学读本
跳到导航 跳到搜索

在Python中,一个.py文件就称之为一个模块(Module)。使用模块还可以避免函数名和变量名冲突。为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。引入了包以后,模块名字就变为“包的文件夹名.模块的文件名”。

模块(module)[编辑]

模块(module)可以是下述实体:

  • Python文件(.py)
  • Unix与Linux的共享对象,其后缀为.so
  • Windows的DLL,后缀为.pyd
  • 目录,其应包含一个__init__.py文件。

任何模块代码的第一个字符串都被视为模块的文档注释;

Python的搜索路径sys.path,这是一个列表,包含了:

  • 当前进程根目录
  • PYTHONPATH 环境变量指定的路径列表。
  • Python 标准库目录列表。
  • 路径⽂文件 (.pth) 保存的目录 (通常放在 site-packages目录下)

虚拟机按以下顺序匹配⺫⽬目标模块:

  • py 源码⽂文件。
  • pyc 字节码⽂文件。
  • egg 包⽂文件或⺫⽬目录。
  • so、dll、pyd 等扩展⽂文件。
  • 内置模块。
  • 其他。

Python模块,可由import命令加载:

import module1[ as aliasname, module2[,... moduleN]

一个模块只会被导入一次,不管执行了多少次import语句。模块的名字追加到了当前符号表,但没有把该模块中的函数名称写入到当前符号表里。

从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[ as alisasname, name2[, ... nameN]]
from module2 import *

每个模块有自己独立的符号表,在模块内部的函数当作全局符号表来使用。

模块内部__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,如下列。类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,即它们应视作模块私有的名字。

  • __name__属性,其值为模块名 <package>.<module>;当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
  • __file__: 模块完整⽂文件名。
  • __dict__: 模块 globals 名字空间。
  • __doc__:模块定义的文档注释

内置函数 dir() 以字符串列表的形式返回指定模块内定义的所有名称。

可以应对包不存在的异常:

try:
 import custommodule
except ImportError:
 pass

sys.modules 是一个字典,它包含了从 Python 开始运行起,被导入的所有模块。键字就是模块名,键值就是模块对象。列出已经导入的模块:

print('\n'.join(sys.modules.keys()))

每个 Python 类都拥有一个内置的类属性 __module__,它定义了这个类的模块的名字。

from math import cos
cos.__module__

卸载一个模块:

del sys.modules["moduleName"]

可⽤用 imp.find_module() 获取模块的具体⽂文件信息:

imp.find_module("numpy")


包(package)[编辑]

包,是多个模块的组织体系。目录只有包含一个叫做 __init__.py 的文件(哪怕是空文件)才会被认作是一个包。否则,,Python就把这个目录当成普通目录。__init__.py本身就是一个模块,而它的模块名就是包名。

可以有多级目录,组成多级层次的包结构。

如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。如果 __all__ 没有定义,使用from 包.子包 import * 这种语法的时候,不会导入包 里的任何子模块,只是把包和它里面定义的所有内容导入进来。

包内部的一个模块,可以如下引用这个包的其它模块:

from . import another_module