在前面的几个章节中咱们脚本上是用 python 解释器来编程,若是你从 Python 解释器退出再进入,那么你定义的全部的方法和变量就都消失了。python
为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。linux
模块是一个包含全部你定义的函数和变量的文件,其后缀名是.py。模块能够被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。程序员
下面是一个使用 python 标准库中模块的例子。编程
执行结果以下所示:api
$ python using_sys.py 参数1 参数2 命令行参数以下: using_sys.py 参数1 参数2 Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
想使用 Python 源文件,只需在另外一个源文件里执行 import 语句,语法以下:app
import module1[, module2[,... moduleN]
当解释器遇到 import 语句,若是模块在当前的搜索路径就会被导入。ide
搜索路径是一个解释器会先进行搜索的全部目录的列表。如想要导入模块 support,须要把命令放在脚本的顶端:函数
test.py 引入 support 模块:ui
以上实例输出结果:spa
$ python3 test.py Hello : Runoob
一个模块只会被导入一次,无论你执行了多少次import。这样能够防止导入模块被一遍又一遍地执行。
当咱们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?
这就涉及到Python的搜索路径,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。
这看起来很像环境变量,事实上,也能够经过定义环境变量的方式来肯定搜索路径。
搜索路径是在Python编译或安装的时候肯定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量,作一个简单的实验,在交互式解释器中,输入如下代码:
>>> import sys >>> sys.path ['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] >>>
sys.path 输出是一个列表,其中第一项是空串'',表明当前目录(如果从一个脚本中打印出来的话,能够更清楚地看出是哪一个目录),亦即咱们执行python解释器的目录(对于脚本的话就是运行的脚本所在的目录)。
所以若像我同样在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。
了解了搜索路径的概念,就能够在脚本中修改sys.path来引入一些不在搜索路径中的模块。
如今,在解释器的当前目录或者 sys.path 中的一个目录里面来建立一个fibo.py的文件,代码以下:
而后进入Python解释器,使用下面的命令导入这个模块:
>>> import fibo
这样作并无把直接定义在fibo中的函数名称写入到当前符号表里,只是把模块fibo的名字写到了那里。
可使用模块名称来访问函数:
若是你打算常用一个函数,你能够把它赋给一个本地的名称:
>>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法以下:
from modname import name1[, name2[, ... nameN]]
例如,要导入模块 fibo 的 fib 函数,使用以下语句:
>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的fib函数引入进来。
把一个模块的全部内容全都导入到当前的命名空间也是可行的,只需使用以下声明:
from modname import *
这提供了一个简单的方法来导入一个模块中的全部项目。然而这种声明不应被过多地使用。
模块除了方法定义,还能够包括可执行的代码。这些代码通常用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
每一个模块有各自独立的符号表,在模块内部为全部的函数看成全局符号表来使用。
因此,模块的做者能够放心大胆的在模块内部使用这些全局变量,而不用担忧把其余用户的全局变量搞混。
从另外一个方面,当你确实知道你在作什么的话,你也能够经过 modname.itemname 这样的表示法来访问模块内的函数。
模块是能够导入其余模块的。在一个模块(或者脚本,或者其余地方)的最前面使用 import 来导入一个模块,固然这只是一个惯例,而不是强制的。被导入的模块的名称将被放入当前操做的模块的符号表中。
还有一种导入的方法,可使用 import 直接把模块内(函数,变量的)名称导入到当前操做模块。好比:
>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这种导入的方法不会把被导入的模块的名称放在当前的字符表中(因此在这个例子里面,fibo 这个名称是没有定义的)。
这还有一种方法,能够一次性的把模块中的全部(函数,变量)名称都导入到当前模块的字符表:
>>> from fibo import * >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这将把全部的名字都导入进来,可是那些由单一下划线(_)开头的名字不在此例。大多数状况, Python程序员不使用这种方法,由于引入的其它来源的命名,极可能覆盖了已有的定义。
一个模块被另外一个程序第一次引入时,其主程序将运行。若是咱们想在模块被引入时,模块中的某一程序块不执行,咱们能够用__name__属性来使该程序块仅在该模块自身运行时执行。
#!/usr/bin/python3 # Filename: using_name.py if __name__ == '__main__': print('程序自身在运行') else: print('我来自另外一模块')
运行输出以下:
$ python using_name.py 程序自身在运行
$ python
>>> import using_name 我来自另外一模块 >>>
说明: 每一个模块都有一个__name__属性,当其值是'__main__'时,代表该模块自身在运行,不然是被引入。
说明:__name__ 与 __main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。
内置的函数 dir() 能够找到模块内定义的全部名称。以一个字符串列表的形式返回:
>>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version'