Python/模块

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

模块(module)[编辑]

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

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

一个模块只会被导入一次,不管执行了多少次import。Python的搜索路径sys.path,这是一个列表。模块的名字追加到了当前符号表,但没有把该模块中的函数名称写入到当前符号表里。

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

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

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

__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。

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

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

try:
 import custommodule
except ImportError:
 pass

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

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

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

from math import cos
cos.__module__

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

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

包(package)[编辑]

包,是多个模块的组织体系。目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包。

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

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

from . import another_module