每个python文件就是一个模块_4.1、Python模块和包(0602)

模块、异常、运行环境、mysqldb

模块:

顶层文件:作为整个文件的程序入口,就是负责去调用其他文件中的代码来实现程序流程功能的,称为顶层程序文件,

模块文件1

模块文件2

python模块

1、可以将代码量较大的程序分割成多个有组织、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块

2、模块在物理形式上表现为以.py结尾的代码文件

一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件

模块的文件名就是模块的名字加上扩展名.py

每个模块都有自己的名称空间

3、python允许“导入”其他模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统

python中,模块也是对象

在一个模块的顶层定义的所有变量都在被导入时成为了被导入模块的属性

在python中一切皆对象,所以模块也是对象,也就意味着模块有属性和方法。

在一个模块的顶层定义的所有变量都在被导入时成为了被导入模块的属性

在一个所谓的程序文件中,直接顶格定义和声明的变量,都称为全局变量,对于一个模块来讲,在顶层定义的变量统统都称为模块的属性,而在模块内部所定义的类,方法(函数)等,则成为类似于这个模块可被调用的属性。

python程序架构

1、一个python程序通常包括一个顶层程序文件和其它的模块文件(0个、1个或多个)

顶层文件:包含了程序的主要控制流程

模块文件:为顶层文件或其它模块提供了各种功能性组件

模块首次导入(或重载)时,python会立即执行模块文件的顶层程序代码(不在函数内的代码),而位于函数主体内的代码直到函数被调用后才会执行

1407552-20180729101347591-200799699.png

1407552-20180729102920726-1572524929.png

函数什么时候被执行?

1407552-20180729103645032-168651503.png

模块的执行环境

1、模块是被导入的,但是模块也可以导入和使用其他模块,这些模块可以用python或其他编程语言写成

2、模块也可以导入其他模块,导入是一种链式关系,

3、模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其他元素

1407552-20180730085415946-597843585.png

导入模块

1、在导入模块时只能使用模块名,而不能使用.py后缀的模块文件名

2、import语句

导入指定的整个模块,包括生成一个以模块名命名的名称空间

import module1[,modile2[,...moduleN]]

建议一个import语句只导入一个模块

import module as module_alias

3、from-import语句

常用于只导入指定模块的部分属性至当前名称空间

from module import name1[,name2[,nameN]]

1407552-20180729105701624-887553895.png

1407552-20180729110333412-355827784.png

4、import和from-import是赋值语句

import和from是可执行语句,类似于def,因此,它们可以嵌套在if测试中,出现于def中等等

python执行到这些语句时才会对其进行解析,这意味着,所有来自模块的属性仅在import语句执行后才能使用

5、import和from-import是隐形赋值语句

import将整个模块对象赋值给一个变量名

from将一个或多个变量名赋值给导入此模块的模块中的同名对象

6、模块就是名称空间

模块的名称空间可以通过属性__dict__或dir(M)获取

模块属性可通过点号(.)运算符获取,格式为M.attr

模块是一个独立的作用域(本地变量就是全局变量)

1407552-20180729122812920-112049970.png

import的工作机制

1、import语句导入指定的模块时会执行三个步骤

找到模块文件

在制定路径下搜索模块文件

编译成字节码

文件导入时就会编译,因此顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc

执行模块的代码来创建其所定义的对象

模块文件中的所有语句会依次执行,从头至尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性

2、注意:模块只在第一次导入时才会执行如上步骤:

后续的导入操作只不过是提取内存中已加载的模块对象

reload()可用于重新加载模块

模块搜索

1、python解释器在import模块时必须先找到对应的模块文件

程序的主目录

python path目录(如果设置了此变量)

标准链接库目录

任何.pth文件的内容(如果存在.pth文件)

2、这四个组件组合起来即为sys.path所包含的路径,而python会选择在搜素路径中的第一个符合导入文件名的文件

1407552-20180730093825305-1330372631.png

1407552-20180729172941437-259430322.png

列表是可以修改的,所以模块路径也可以修改,使用append或者insert新路径

在目录/tmp/python27/lib下创建mymod.py,并添加执行权限chmod +x python27/lib/mymod.py

1407552-20180729173746816-219953326.png

1407552-20180729174513547-109340834.png

1407552-20180729174633852-179311630.png

1407552-20180729174740346-1929780695.png

如何对代码进行测试,以上只能自命令行中载入做测试,如何进行自我测试?

如果一个模块是被导入的,那么这个模块自己的__name__属性中所保存的是自己的模块名称,

如果一个模块不是被导入,而是自我直接执行的,那么__name__属性中所保存的是__main__

1407552-20180729175642048-2047234778.png

1407552-20180729180457801-2121380059.png

python包

1、包用于将一组模块归并到一个目录中,此目录即为包,目录名即为包名

包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的python应用程序执行环境

基于包,python在执行模块导入时可以指定模块的导入路径

import dir1.dir2.mod1

dir1:最外层的包名

dir2:子包名

mod1:模块名

2、要使用如图所示的package1,则py_pkg_mod容器必须要在模块搜索路径中

import package1.mod1

3、包导入语句的路径内的每个目录内都必须由__init__.py文件

__init__.py可包含python代码,但通常为空,仅用于扮演包初始化的挂钩、替目录产生模块命名空间以及使用目录导入时实现from*行为的角色

1407552-20180730095224288-727318102.png

1407552-20180729183644379-299818957.png

1407552-20180729190049903-645869392.png

1407552-20180729192200721-1797195756.png

模块的顶层执行及被导入

1、一个模块文件可以同时支持顶层执行(作为顶层文件)或被导入(作为模块文件)

每个模块都有个名为__name__的内置属性,python会自动设置该属性

如果文件是以顶层程序文件执行,在启动时,__name__的值为"__main__"

如果是被导入,则__name__的值为模块名

可以在模块文件中检测自己的__name__属性,以之实现在执行时运行指定的代码

常用于模块的自我测试

1407552-20180730100014991-514018165.png

发布python模块或程序

python模块、扩展和应用程序可以按以下几种形式进行打包和发布

压缩文件(使用distutils)

windows的zip文件和类Unix平台的.tar.gz文件

自动解包或自动安装可执行文件

Windows中的.exe文件

自包含的,不要求安装预备运行可执行程序

Windows的.exe文件、Unix上带有一个小的脚本前缀的ZIP压缩文件、Mac上的.app文件等

平台相关的安装程序

Windows上的.msi文件、Linux上常见的.rpm、src.rpm和.deb文件等

python eggs

较流行的第三方扩展

使用disutils发布模块

1、distutils模块能够帮助完成模块或程序发布

“发布”是指一个文件集合,这些文件联合在一起可使用distutiles构建、打包和发布模块

创建好的发布可以用于安装,也可上传到PyPI与他人共享

2、创建发布

将各代码文件组织到模块容器中

准备一个README或README.txt文件

而后在容器中创建setup.py文件

1407552-20180730101247824-1477375149.png

setup.py的常用参数

将各代码文件组织到模块容器中,而后在容器中创建setup.py文件

1407552-20180730101442003-1296503575.png

setup.py中setup()中可用参数

name 包的名称

platforms:平台列表

license:许可证

py_modules:各模块名称组成的列表,此些模块可能唯一包的根目录下(modname),也可能位于某子包目录中(subpkg1.modname),内部包含的各模块,如果是多个模块,则需要用逗号 , 隔开

packages:各子包名称的列表

setup.py中大体分为两类:元数据信息和包中的内容列表

最关键的三项name verson py_modules

完成打包

在要发布的容器目录中执行“python setup.py sdist”命令

1407552-20180730101634096-1056320603.png

python setup.py sdist 打包格式 源码包\发行包

可以为sdist指定格式--formats=

zip:zip file

gztar: tar.gz file

bzatar:tar.bz2 file

ztar: tar.Z file

tar: tar file 只打包不压缩

python setup.py bdist 二进制发行版

可以为ddist指定格式--formats=

zip:zip file 压缩文件

gztar:tar.gz file

ztar:tar.Z file

tar:tar file

rpm:RPM Package RPM包

pkgtool:Solaris pkgtool

wininst:Window上自解压的zip格式的包

msi:microsoft installer Windows可安装程序

bdist 打包专用命令

bdist_dump 做成tar,gztar,ztar,zip类型的包

bdist_rpm 相当于bdist后面跟上rpm选项

bdist_wininst

bdist_msi

使用源码包进行打包

1407552-20180729211008133-1268920982.png

1407552-20180729211204790-1575744394.png

1407552-20180729211529714-1575460190.png

1407552-20180729211703627-1440330750.png

使用二进制bdist格式打包

1407552-20180729212842231-1342768025.png

1407552-20180729213326467-1559425624.png

1407552-20180729213236710-312682423.png

# python27 setup.py sdist --formats=gztar //添加选项的打包

# python27 setup.py bdist --formats=rpm //在发行目录下即dist可以找到.rpm格式的文件

1407552-20180729214518336-710633201.png

获取帮助的方式

python setup.py --help

python setup.py --help-commands:所有可以使用的命令。如build,install

python setup.py COMMAND --help:获取特定命令的帮助

python setup.py COMMAND --help-formats:获取特定命令支持使用的格式

了解两个工具pip,esay_install的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值