PS:【笔记+代码+图片】在GitHub上持续更新,欢迎star:https://github.com/gdouchufu/Core-Python-Programming
本章介绍 Python 模块和如何把数据从模块中导入到编程环境中。模块是用来组织 Python 代码的方法,而包则是用来组织模块的。
自我包含并且有组织的代码片断就是模块( module ),模块是按照逻辑来组织 Python 代码。
文件是在物理层上组织模块的方法。
一个文件被看作是一个独立模块, 一个模块也可以被看作是一个文件。
路径搜索:查找某个文件的操作。
搜索路径:去查找一组目录。(导入模块错误就是搜索路径下不存在该模块)
sys.path
:查看当前的搜索路径。
sys.modules
:当前导入了哪些模块和它们来自什么地方。
命名空间 是标识符(变量名)到对象的映射。
Python 解释器加载 命名空间 的顺序:
__builtins__
;__builtins__
和 __builtin__
的区别:
__builtins__
模块包含内建函数,异常以及其他属性。 __builtins__
包含 __builtin__
的所有name。如果在执行期间调用了一个函数,那么将创建出第三个命名空间, 即 局部命名空间。
局部命名空间 → 全局命名空间 → 内建命名空间
随时都可以给函数添加任何属性。
使用from module import name1[, name2[,... nameN]]
导入指定的模块属性。
不提倡使用 from Tkinter import *
语句
as
)import Tkinter as tk
from cgi import FieldStorage as form
from module import *
的使用场合只从模块导入名字的副作用是那些名字会成为局部命名空间的一部分。
__future__
体验Python新特性:from __future__ import new_feature
警告框架的两个组件:
Warning
直接从 Exception
继承,是所有警告(UserWarning
、DeprecationWarning
、SyntaxWarning
、 RuntimeWarning
)的基类。.py
、.pyc,
、 .pyo
文件)的 .zip
文件,导入时会把 ZIP 文件当作目录处理,在文件中搜索模块。.py
文件, 那么 Python 不会为其添加对应的 .pyc
文件(一个 ZIP 归档没有匹配的 .pyc
文件时, 导入速度会相对慢一点)。__import__()
# __import__(module_name[, globals[, locals[, fromlist]]])
sys = __import__('sys')
globals()
和 locals()
globals()
和 locals()
以字典形式返回调用者的全局命名空间和局部命名空间。globals()
和 locals()
返回相同的字典,因为此时的局部命名空间就是全局空间。reload()
reload() 内建函数:重新导入一个已经导入过的模块。
reload()
使用要求:
from-import
),而且它已被成功导入。import sys
reload(sys)
包是一个有层次的文件目录结构,定义了一个由模块和子包组成的 Python 应用程序执行环境。
from package.module import sub_module
__init__.py
文件,用于初始化模块。包支持 from-import all 语句:from package.module import *
【__init__.py
中的 __all__
变量包含执行该语句时应该导入的模块名字符串列表。】
所有的导入都被认为是绝对的,即这些被导入的模块必须通过Python路径(sys.path
或是PYTHONPATH
)来访问。
from Phone.Mobile.Analog import dial # 绝对导入
from .Analog import dial # 相对导入
from ..Fax import G3.dial # 相对导入
sys.modules
变量包含当前载入到解释器的模块组成的字典(key为模块名,value为模块路径)
如果不想让某个模块属性被 from module import *
导入 ,可以在不想导入的属性名称加上一个下划线_
。
指定 PYTHONCASEOK
环境变量,以不区分大小写地导入模块。
Python默认的编码格式是ASCII,在模块头部可以指定编码格式。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
omh4cli.py
代码:
from cli4vof import cli4vof
# command line interface utility function
def cli_util():
pass
# overly massive handlers for the command line interface
def omh4cli():
cli4vof()
omh4cli()
cli4vof.py
代码:
# command-line interface for a very outstanding feature
def cli4vof():
import omh4cli
omh4cli.cli_util()
执行命令:python omh4cli.py
,不会因为循环导入模块而运行失败。
python hello.py
execfile()
:execfile('C:/hello.py')
import hello
python -m SimpleHTTPServer
imp
:这个模块提供了一些底层的导入者功能。modulefinder
:该模块允许你查找 Python 脚本所使用的所有模块。pkgutil
:该模块提供了多种把 Python 包打包为一个”包”文件(*.pkg
)分发的方法。 site
:和 *.pth
文件配合使用, 指定包加入 Python 路径的顺序。zipimport
:使用该模块导入 ZIP 归档文件中的模块。distutils
:该模块提供了对建立、 安装、分发 Python 模块和包的支持。12–1. 路径搜索和搜索路径。 路径搜索和搜索路径之间有什么不同?
参考:12.2.2 搜索路径和路径搜索
12–2. 导入属性。 假设你的模块 mymodule 里有一个 foo() 函数。
(a) 把这个函数导入到你的命名空间有哪两种方法?
from mymodule import foo
import mymodule
(b) 这两种方法导入后的命名空间有什么不同?
第一种方式导入后的命名空间是局部命名空间(可直接使用foo()
),第二种导入后的命名空间是全局命名空间(通过指定模块名才能使用:mymodule.foo()
)
12–3. 导入. “import module” 和 “fromn module import *” 有什么不同?
fromn module import *
导入后的命名空间是局部命名空间,可以直接使用module 模块的所有属性。
12–4. 命名空间和变量作用域。命名空间和变量作用域有什么不同?
命名空间(Namespaces)是名称(标识符)到对象的映射。所有局部空间的名称都在局部作用范围内。局部作用范围以外的的所有名称都在全局作用范围内。 局部命名空间和作用域会随函数调用不断变化,全局命名空间不变。
12–5. 使用 __import__()
.
(a) 使用 __import__()
把一个模块导入到你的命名空间。 你最后使用了什么样的语法?
sys = __import__('sys')
(b) 和上边相同,使用 __import__()
从指定模块导入特定的名字。
__import__('os',globals(),locals(),['path','pip'])
12–6. 扩展导入。创建一个 importAs() 函数. 这个函数可以把一个模块导入到你的命名空间, 但使用你指定的名字, 而不是原始名字。 例如, 调用wname=importAs(‘mymodule’) 会导入mymodule , 但模块和它的所有元素都通过新名称 newname 或 newname.attr 访问。 这是 Python2.0 引入的扩展导入实现的功能。
def importAs(module_name):
return __import__(module_name)
sys = importAs('sys')
print sys.path
12–7. 导入钩子。 研究 PEP 302 的导入钩子机制. 实现你自己的导入机制, 允许编码你的模块(encryption, bzip2, rot13, 等), 这样解释器会自动解码它们并正确导入。你可以参看 zip 文件导入的实现 (参阅 第 12.5.7 节)。
略。