1、Python模块和包(0602)
模块、异常、运行环境、mysqldb
模块:
顶层文件:作为整个文件的程序入口,就是负责去调用其他文件中的代码来实现程序流程功能的,称为顶层程序文件,
模块文件1
模块文件2
python模块
1、可以将代码量较大的程序分割成多个有组织、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块
2、模块在物理形式上表现为以.py结尾的代码文件
- 一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件
- 模块的文件名就是模块的名字加上扩展名.py
- 每个模块都有自己的名称空间
3、python允许“导入”其他模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统
- python中,模块也是对象
- 在一个模块的顶层定义的所有变量都在被导入时成为了被导入模块的属性
在python中一切皆对象,所以模块也是对象,也就意味着模块有属性和方法。
在一个模块的顶层定义的所有变量都在被导入时成为了被导入模块的属性
在一个所谓的程序文件中,直接顶格定义和声明的变量,都称为全局变量,对于一个模块来讲,在顶层定义的变量统统都称为模块的属性,而在模块内部所定义的类,方法(函数)等,则成为类似于这个模块可被调用的属性。
python程序架构
1、一个python程序通常包括一个顶层程序文件和其它的模块文件(0个、1个或多个)
顶层文件:包含了程序的主要控制流程
模块文件:为顶层文件或其它模块提供了各种功能性组件
模块首次导入(或重载)时,python会立即执行模块文件的顶层程序代码(不在函数内的代码),而位于函数主体内的代码直到函数被调用后才会执行
函数什么时候被执行?
模块的执行环境
1、模块是被导入的,但是模块也可以导入和使用其他模块,这些模块可以用python或其他编程语言写成
2、模块也可以导入其他模块,导入是一种链式关系,
3、模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其他元素
导入模块
1、在导入模块时只能使用模块名,而不能使用.py后缀的模块文件名
2、import语句
- 导入指定的整个模块,包括生成一个以模块名命名的名称空间
- import module1[,modile2[,...moduleN]]
- 建议一个import语句只导入一个模块
- import module as module_alias
3、from-import语句
- 常用于只导入指定模块的部分属性至当前名称空间
- from module import name1[,name2[,nameN]]
4、import和from-import是赋值语句
- import和from是可执行语句,类似于def,因此,它们可以嵌套在if测试中,出现于def中等等
- python执行到这些语句时才会对其进行解析,这意味着,所有来自模块的属性仅在import语句执行后才能使用
5、import和from-import是隐形赋值语句
- import将整个模块对象赋值给一个变量名
- from将一个或多个变量名赋值给导入此模块的模块中的同名对象
6、模块就是名称空间
- 模块的名称空间可以通过属性__dict__或dir(M)获取
- 模块属性可通过点号(.)运算符获取,格式为M.attr
- 模块是一个独立的作用域(本地变量就是全局变量)
import的工作机制
1、import语句导入指定的模块时会执行三个步骤
- 找到模块文件
- 在制定路径下搜索模块文件
- 编译成字节码
- 文件导入时就会编译,因此顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc
- 执行模块的代码来创建其所定义的对象
- 模块文件中的所有语句会依次执行,从头至尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性
2、注意:模块只在第一次导入时才会执行如上步骤:
- 后续的导入操作只不过是提取内存中已加载的模块对象
- reload()可用于重新加载模块
模块搜索
1、python解释器在import模块时必须先找到对应的模块文件
- 程序的主目录
- python path目录(如果设置了此变量)
- 标准链接库目录
- 任何.pth文件的内容(如果存在.pth文件)
2、这四个组件组合起来即为sys.path所包含的路径,而python会选择在搜素路径中的第一个符合导入文件名的文件
列表是可以修改的,所以模块路径也可以修改,使用append或者insert新路径
在目录/tmp/python27/lib下创建mymod.py,并添加执行权限chmod +x python27/lib/mymod.py
如何对代码进行测试,以上只能自命令行中载入做测试,如何进行自我测试?
如果一个模块是被导入的,那么这个模块自己的__name__属性中所保存的是自己的模块名称,
如果一个模块不是被导入,而是自我直接执行的,那么__name__属性中所保存的是__main__
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*行为的角色
模块的顶层执行及被导入
1、一个模块文件可以同时支持顶层执行(作为顶层文件)或被导入(作为模块文件)
- 每个模块都有个名为__name__的内置属性,python会自动设置该属性
- 如果文件是以顶层程序文件执行,在启动时,__name__的值为"__main__"
- 如果是被导入,则__name__的值为模块名
- 可以在模块文件中检测自己的__name__属性,以之实现在执行时运行指定的代码
- 常用于模块的自我测试
发布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文件
setup.py的常用参数
将各代码文件组织到模块容器中,而后在容器中创建setup.py文件
setup.py中setup()中可用参数
name 包的名称
platforms:平台列表
license:许可证
py_modules:各模块名称组成的列表,此些模块可能唯一包的根目录下(modname),也可能位于某子包目录中(subpkg1.modname),内部包含的各模块,如果是多个模块,则需要用逗号 , 隔开
packages:各子包名称的列表
setup.py中大体分为两类:元数据信息和包中的内容列表
最关键的三项name verson py_modules
完成打包
在要发布的容器目录中执行“python setup.py sdist”命令
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
使用源码包进行打包
使用二进制bdist格式打包
# python27 setup.py sdist --formats=gztar //添加选项的打包
# python27 setup.py bdist --formats=rpm //在发行目录下即dist可以找到.rpm格式的文件
获取帮助的方式
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的使用
1、Python模块和包(0602)的更多相关文章
- Python/模块与包之模块
Python/模块与包之模块 1.什么是模块? 模块就是py文件 2.为什么要用模块? 如果在解释器上进行编码,把解释器关闭之前写的文件就不存在了,如果使用模块的话就能永久保存在磁盘中. 3.如何使用 ...
- Python模块、包、异常、文件(案例)
Python模块.包.异常.文件(案例) python.py #模块 # Python中的模块(Module),是一个Python文件,以.py文件结尾,包含了Python对象定义和Python语句, ...
- 【Python】解析Python模块与包
模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块. import语句是用来导入模块或者从模块里导入特定的类或者函数.如前面我们用过的math模块,从而可以 ...
- python 模块和包深度学习理解
python 模块和包 简单说相当于命名空间 1,python 模块 python模块就是一个文件,里面有函数,变量等 import 模块 模块.方法 from 模块 import fu ...
- (三)运用Python模块和包
1 引言 为了能够在Python项目中高效地运用Python模块和包,我们需要进一步地来了解它们是如何在Python项目中进行定义.使用和工作的. 2 Python模块和包 Python模块和包的基本 ...
- Python模块04/包/logging日志
Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...
- Python模块和包
模块和包是python组织代码的基本方式. 模块: python的每一个脚本文件都可称之为模块,模块的名称就是脚本的文件名.例如当我们写了一个test.py的脚本文件,则可以在同目录下的另外一个脚本m ...
- python模块与包的导入
1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...
- python模块及包的导入
一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...
随机推荐
- Linux基础命令---查找用户信息finger
finger finger指令用来查找.显示指定用户的信息.查询远程主机信息是,可以用user@localhost来指定用户. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.S ...
- 浅析PAC,修改PAC文件及user-rule文件实现自动代理
浅析PAC,修改PAC文件及user-rule文件实现自动代理 代理自动配置(英语:Proxy auto-config,简称PAC)是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来 ...
- GUI常用对象的属性
%常用对象的属性 %.figure %hf=figure; %get(hf); %改变颜色 set Color %set(hf,'Color','w'); %去掉默认的菜单 Menubar %set( ...
- 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) (优先队列)
题目链接:http://abc042.contest.atcoder.jp/tasks/abc042_b Time limit : 2sec / Memory limit : 256MB Score ...
- 处理jquery的ajax请求session过期跳转到登录页面
首先需要在拦截器中判断是否是ajax请求,如果是 if(isAjaxRequest(request)){//ajax请求 response.setHeader("sessionstatus& ...
- 被fancybox坑的心路历程
今天项目中需要使用fancybox来展示图片,但是使用中发现fancybox没起作用,点击图片直接刷新了页面! fancybox的原理是通过给a标签绑定事件,使得a标签不在是直接跳转链接,而是把链接中 ...
- Linux内核Socket参数调优
可调优的内核变量存在两种主要接口:sysctl命令和/proc文件系统,proc中与进程无关的所有信息都被移植到sysfs中.IPV4协议栈的sysctl参数主要是sysctl.net.core.sy ...
- oracle 12c多租户下的日常操作变化
Oracle 12c创建用户时出现“ORA-65096: invalid common user or role name”的错误 在oracle中,引入了多租户概念,以前是一个instance对应一 ...
- mybatis 3.2.*打印sql结果集
虽然可以写个interceptor记录下,但是总归没有log4j来的自然.一段时间不查问题,总是要忘了,记录下: 在mybatis 3.2.*中,可以在log4j中如下配置: log4j.logger ...
- 【题解】Luogu P2319 [HNOI2006]超级英雄
原题传送门 这道题就是一个很简单的二分图匹配 二分图匹配详解 一开始想的是2-sat和网络流,根本没想匈牙利和HK 这道题只要注意一点:当一个点匹配不成功之后就直接退出 剩下的就写个二分图最大匹配就行 ...