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