Python 2.7 模块

模块


创建脚本
使用文本编辑器准备解释器的输入,令编写的文件作为输入执行解释器,这被称作创建脚本。

模块
包含定义并且可以在脚本或解释器实例中使用的文件称为模块。
模块中的定义可以被引入其他模块或主模块中。
主模块中的可以被访问的变量集合位于最高层运行的脚本中,并且处理计算器模式。

模块是包含Python定义与语句的文件,文件名是模块名加.py后缀。模块名可以由全局变量__name__访问。

# 导入模块(模块文件 fibo.py,位于解释器启动目录)
import fibo
# 访问模块方法
fibo.fib(100)
# 访问模块名
# fibo.__name__
# 模仿方法赋值本地变量(方便使用)
f = fibo.fib
f.(100)

1 模块细节

模块既可以包含函数定义,也可以包含可执行语句。这些语句仅在第一次被导入的地方执行一次。

每个模块有自己私有的符号表,被模块内所有函数作为全局符号表使用。使用引用模块函数的方法访问模块的全局变量,modename.itemname。

import导入其他模块,被导入的模块名会放入当前模块的全局符号表中。

将模块中的名称直接导入导入模块的符号表

# 导入fib、fib2
from fibo import fib, fib2
fib(500)
# 导入模块中定义中定义的所有名称(除了下划线开头的名称)
from fibo import *
fib(500)

note:此操作实际上并没有导入模块,只是导入了模块中定义的名称。

重加载模块

reload(fibo)

note:解释器无需重启,就可以获取已经改变的模块中的定义。

1.1 作为脚本执行模块

运行python

python fibo.py <arguments>

note:模块中的代码将会被执行。
note:__name__会被设置为"main"。

1.2 模块的搜索路径

当一个名为aaa的模块被导入时,解释器首先查找具有此名的内置模块。如果没有找到,接下来会在变量sys.path给出的目录列表中查找名为aaa.py的文件。

sys.path初始化使用的位置:

  • 包含输入脚本的目录(当前目录)
  • PYTHONPATH(目录名称列表,语法结构与shell变量PATH相同)
  • 安装相关默认值

初始化之后,Python程序可以修改sys.path。当前目录位于搜索目录的开头,在标准库路径之前。这意味着当前目录下加载的脚本将会取代具有相同名称的库目录下的脚本。除非希望替换,否者这是一个错误。

1.3 “编译” Python文件

作为使用了大量标准模块的短程序的启动时间的重要加速,如果一个为名aaaa.pyc的文件存在于aaaa.py存在的目录,便可以假定包括模块aaaa的已经经过“字节编译”的版本。用于创建aaaa.pyc的aaaa.py版本的修改时间记录进了aaaa.pyc中,如果创建时间与修改时间不匹配,.pyc文件将会被忽略。

当aaaa.py文件成功编译时,便会尝试将编译版本写入aaaa.pyc文件中。如果尝试失败,也不会报错。如果aaaa.pyc文件处于某些原因没能被完整写入,生成的aaaa.pyc文件将会被识别为无效,并在之后被忽略。aaaa.pyc的内容时独立于平台的,所以Python模块目录可以被不同架构的机器所共享。

  • 当Python解释器伴随-o标记被调用,将会生成优化代码,并将其存储在.pyo文件中。
  • 程序从.pyc文件或.pyo文件中读取时,程序运行速度并不比从.py文件中读取运行得更快。只有加载的速度,.pyc或.pyo将会被.py文件快。
  • 当一个脚本通过从命令行给定的名称运行时,此脚本的字节码不会被写入.pyc或.pyo文件中。因此,可以通过将脚本的大量代码放入模块保留少量引入模块的启动脚本可以减少脚本的启动时间。也可以直接在命令行上命名.pyc或.pyo文件。
  • 可以有名为aaaa.pyc的文件而没有对应模块的aaaa.py文件。这可以令发布的Python代码库的逆向工程难度加大。
  • 模块compileall可以为目录中的所有模块创建.pyc文件。

2 标准模块

Python附带有一个标准模板库。一些模块内置进了解释器,这些模块提供了对一些并不术语语言核心但仍然内置的操作的访问,或是为了效率或是为了提供类似系统调用一样的操作系统原语的访问。这些模块的集合是依赖于底层平台的配置选项。

注意sys模块内置于所有的Python解释器中。

import sys
# 主提示符
sys.ps1
# 副提示符
sys.ps2

note:ps1、ps2只有在交互模式下才会被定义。

3 dir()函数

查看模块定义的名称

# 查看fibo模块定义的名称
import fibo
dir(fibo)
# 查看当前定义的名称(包含所有类型的名称:变量、模块、函数等)
dir()
# 查看内置函数与变量名(内置变量与函数定义在__builtin__模块中)
import __builtin__
dir(__builtin__)

4 包

包是通过使用“圆点模块名”组织Python命名空间的方式。
eg:模块名A.B表示名为A的包下的名为B的子模块。
使用原点模块名使得多模块软件包的作者不需要担心彼此的模块名发生冲突。

当导入包时,Python会根据sys.path提供的目录查找包的子目录。
Python将目录视为包需要__init__.py文件,这样做可以防止拥有通用名称的目录无意间隐藏了模块搜索路径稍后位置出现的有效模板。init.py可以是一个空文件,也可以执行包的初始化代码或设置__all__变量。

# 导入包中的模块
import aaa.fff
# 使用包中子模块中定义的名称
aaa.fff.fa("ssss")
# 导入包中模块(使用模块时无需加包前缀)
from aaa.bbb import kkk
# 导入包中模块中名称(使用名称时无需加包模块前缀)
from aaa.bbb import fa

4.1 导入包中所有模块

# 包aaa的__init__.py
__all__ = ["kkk", "uuu"]
# 导入包aaa的__init__.py中__all__定义的所有模块
from aaa import *

4.2 包内引用

# 导入当前包下模块
from . import echo
# 导入双亲包下包
from .. import formats
# 导入双亲下包下模块(兄弟模块)
from ..bbb import kkk

note:无论是显式导入还是隐式导入,都是根据当前模块的名称进行导入的。由于主模块的模块名总是"main",所以作为Python应用主模块的模块应该使用绝对引用。

4.3 多目录下的包

包支持一个特殊属性__path__。它会被初始化一个持有目录名称的列表,此目录持有包的__init__.py文件。这个变量可以被修改,用于包内模块与子包的搜索。


参考资料:

Python 2.7 中文教程

Python 2.7 tutorial

猜你喜欢

转载自blog.csdn.net/qq_32165041/article/details/83098074
今日推荐