Python基础篇【第十二篇】:模块导入

1.什么是模块

模块支持从逻辑上组织Python代码,当代码量大的时候,就把代码分成一些有组织的代码段,但是要保证它们彼此交互。代码片段有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关彼此独立的操作函数。这些代码段是共享的,所以Python允许“调入”一个模块,允许使用其他模块的属性来利用之前的工作成果,实现代码重用。这个把其他模块中属性附加到你的模块中的操作叫做导入(import),那些自我包含并且有组织的代码片段就是模块(module)。

2.模块和文件

如果模块说是按照逻辑来组织Python代码的方法,那么文件表示物理层上组织模块的方法。因此,一个文件被看作是一个独立的模块,一个模块也可以看作是一个文件。模块的文件名就是模块的名字加上扩展名.py。

在Python中导入的是模块或模块的属性。

3.模块的搜索路径和路径搜索

模块导入的时候需要一个叫“路径搜索”的过程。即在文件系统“预定义区域”中查找mymodule.py文件(如果导入mymodule的话)。预定义区域是Python搜索路径的集合。路径搜索和搜素路径是两个不同的概念,前者是指查找某个文件的操作,后者是去查找一组目录。

有时候导入模块会报错:

>>> import django
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'django'

 发生错误的时候解释去告诉你无法请求的模块,可能的原因是模块不在搜索路径里(没有安装所以找不到),导致的错误。

默认的搜索路径是在编译或安装的时候指定的,他可以在一个或两个地方修改。

一个是启动Python的shell或命令行的PYTHONPATH环境变量。该变量的内容是一组用冒号分割的目录路径。如果想让解释器使用这个变量,要确保再启动解释器或执行python脚本前设置或修改了该变量。

解释器启动之后,也可以访问这个搜索路径,它会被保存在sys模块的sys,path变量里,不过它已经不是冒号分割的字符串,而是包含每个独立的列表:

>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']

 这只是个列表,所以可以对其更改,只要这个列表中的某个目录包含这个文件,他就会被正确导入。如果想要在其他的目录正确的导入,可以追加列表的方式:

>>> import djanjo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'djanjo'
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
>>> sys.path.append('/Users/zk')
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages', '/Users/zk']
>>> import djanjo
test

 当有一个模块有很多拷贝,解释器会使用沿搜索路径顺序寻找到第一个模块。

使用sys.modules可以找到当前导入了哪些模块和他们来自什么地方:

sys.modules:

>>> sys.modules
{'__main__': <module '__main__' (built-in)>, '_osx_support': <module '_osx_support' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_osx_support.py'>, 'zipimport': <module 'zipimport' (built-in)>, 'rlcompleter': <module 'rlcompleter' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/rlcompleter.py'>, 'errno': <module 'errno' (built-in)>, '_locale': <module '_locale' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, 'posixpath': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/posixpath.py'>, 'genericpath': <module 'genericpath' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/genericpath.py'>, 're': <module 're' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/re.py'>, 'sre_compile': <module 'sre_compile' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sre_compile.py'>, '_stat': <module '_stat' (built-in)>, 'codecs': <module 'codecs' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/codecs.py'>, '_sysconfigdata': <module '_sysconfigdata' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_sysconfigdata.py'>, 'encodings.aliases': <module 'encodings.aliases' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/aliases.py'>, '_warnings': <module '_warnings' (built-in)>, '_signal': <module '_signal' (built-in)>, 'encodings': <module 'encodings' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/__init__.py'>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_bootlocale': <module '_bootlocale' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_bootlocale.py'>, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/os.py'>, 'copyreg': <module 'copyreg' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/copyreg.py'>, 'sre_constants': <module 'sre_constants' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sre_constants.py'>, 'site': <module 'site' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site.py'>, '_collections_abc': <module '_collections_abc' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_collections_abc.py'>, 'keyword': <module 'keyword' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/keyword.py'>, 'sys': <module 'sys' (built-in)>, '_sre': <module '_sre' (built-in)>, '_codecs': <module '_codecs' (built-in)>, '_weakrefset': <module '_weakrefset' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_weakrefset.py'>, 'sre_parse': <module 'sre_parse' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sre_parse.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/utf_8.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_sitebuiltins.py'>, 'io': <module 'io' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/io.py'>, 'builtins': <module 'builtins' (built-in)>, '_weakref': <module '_weakref' (built-in)>, 'posix': <module 'posix' (built-in)>, '_thread': <module '_thread' (built-in)>, '_io': <module 'io' (built-in)>, 'stat': <module 'stat' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/stat.py'>, 'atexit': <module 'atexit' (built-in)>, 'encodings.latin_1': <module 'encodings.latin_1' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/latin_1.py'>, 'marshal': <module 'marshal' (built-in)>, '_imp': <module '_imp' (built-in)>, 'os.path': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/posixpath.py'>, 'abc': <module 'abc' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/abc.py'>, 'sysconfig': <module 'sysconfig' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sysconfig.py'>, 'readline': <module 'readline' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/readline.cpython-35m-darwin.so'>}

 

4.名称空间

名称空间是名称(标识符)到对象的映射。向名称空间添加名称的操作过程涉及绑定标识符到指定对象的操作(以及给该对象的引用计数加1)

*改变一个名字的绑定叫做重新绑定,删除一个名字叫做解除绑定。

在执行期间有两个或三个活动的名称空间。这三个名称空间分别是局部名称空间,全局名称空间和内建名称空间,但局部名称空间在执行期间是不断变化的,所以说“两个或三个”。从名称空间访问这些名字依赖他们的加载顺序,或是系统加载这些名称的顺序。

Python解释器首先加载内建名称空间,它由__builtins__模块中的名字构成。随后加载执行模块的全局名称空间,它会在模块开始执行后变成活动名称空间。这样就有了两个活动名称空间。

如果在执行期间调用了一个函数,那么将创建出第三个名称空间,即局部名称空间。

***

__builtins__模块和__builtin__模块的区别:

虽然这两个长得差不多,只是名字相似而已。

__builtins__模块包含内建名称空间中内建名字的集合。其中大多数来自__builtin__模块,该模块包含内建函数,异常以及其他属性,在标准Python执行环境下,__builtins__包含__builtin__的所有名字

5.导入模块

import语句

import导入模块语句:

import module1

import module2

import语句的模块顺序

Python标准库模块

python第三方模块

应用程序自定义模块

然后使用一个空行分割这三类模块的导入语句。这样确保模块使用固定的习惯导入。有助于减少每个模块需要的import语句数目。

from - import语句

在模块里导入指定的模块。也就是把指定名称导入到当前的作用域。

from module import name

 6.扩展的import语句(as)

就是使用自己想要的名字替换模块的原始名称。一个普遍的解决方案就是把模块赋值给一个变量:

import longlongmodulename
mod = longlongmodulename
del longlongmodulename

 用as:

import longlongmodulename as mod

 

posted @ 2016-05-26 10:43  汪汪小喵咪  阅读(419)  评论(0编辑  收藏  举报