Python模块与包
1.1、模块的定义
-
Python中,模块在物理形式上表现为以.py 结尾的代码文件
一个文件被看作一个独立的模块, 一个模块也可以被看作一个文件; 每个模块都有自己的名称空间。Pyhton允许”导入”其他模块以实现代码重用, 从而实现了将独立的代码文件组织成更大的程序系统。在一个模块顶层定义的所有变量都在被导入时成为了被导入模块的属性。
-
一个python程序通常包括一个顶层文件和其他的模版文件
顶层文件:包含了程序的主要控制流程
模块文件:为顶层文件或其他模块提供各种功能性组件。模块首次导入(或重载)时,Python 会立即执行模块文件的顶层程序代码,而位于函数主体内的代码知道函数被调用后才执行。
1.2、导入模块
在导入模块时只能使用模块名,而不能使用带.py 后缀的模块文件名
import语句,导入指定的整个模块,包括生成一个以模块名命名的名称空间
import module [ , module2 [,...moduleN]]建议一个 import 语句只导入一个模块 import module as module_alias |
from-import 语句, 常用于只导入指定模块的部分属性至当前名称空间
from module import name1[ , name2 [, ...nameN]] import 和 from 是可执行的, 类似于 def,他们可以嵌套在 if 测试中,出现于def 中等等。Python 执行到这些语句时才会对其进行解析,所有来自模块的属性仅在 import 语句执行后才能使用。 |
import和 from 都是隐性赋值语句;import将整个模块对象赋值给一个变量名,from 将一个或多个变量名赋值给导入此模块中的同名对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
In [ 1 ]: import requests #导入整个requests模块
In [ 2 ]: dir (requests) #查看requests模块所支持的方法
Out[ 2 ]:
[ 'ConnectTimeout' ,
'ConnectionError' ,
'DependencyWarning' ,
'FileModeWarning' ,
'HTTPError' ,
'NullHandler' ,
'PreparedRequest' ,
'ReadTimeout' ,
'Request' ,
'RequestException' ,
'Response' ,
'Session' ,
'Timeout' ,
'TooManyRedirects' ,
'URLRequired' ,
'__author__' ,
'__build__' ,
'__builtins__' ,
'__cached__' ,
'__copyright__' ,
'__doc__' ,
'__file__' ,
'__license__' ,
'__loader__' ,
'__name__' ,
'__package__' ,
'__path__' ,
'__spec__' ,
'__title__' ,
'__version__' ,
'_internal_utils' ,
'adapters' ,
'api' ,
'auth' ,
'certs' ,
'codes' ,
'compat' ,
'cookies' ,
'delete' ,
'exceptions' ,
'get' ,
'head' ,
'hooks' ,
'logging' ,
'models' ,
'options' ,
'packages' ,
'patch' ,
'post' ,
'put' ,
'request' ,
'session' ,
'sessions' ,
'status_codes' ,
'structures' ,
'utils' ,
'warnings' ]
In [ 3 ]: from bs4 import BeautifulSoup #从bs4模块中导入BeautifulSoup方法
|
1.3、import 工作机制
-
import 语句导入指定的模块时会执行三个步骤
1、找到模块文件:在指定的路径下搜索模块文件 2、编译成字节码:文件导入时就会编译,顶层文件.pyc 字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc 文件。 3、执行模块的代码来创建其所定义的对象:模块文件中的所有语句会依次执行,从头到尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性。 |
模块只有在第一次导入才会执行如上步骤,后续的导入操作只不过是提取内存中已加载的模块对象,reload()可用于重载加载模块。
1.4、模块的搜索路径
Python 解释器在import模块时必须先找到对应的模块文件,主要有以下四个目录:
程序的主目录; PYTHONPATH 目录(如果设置的此变量); 标准链接库目录; |
这四个组合起来即为 sys.path 所包含的路径,python 会选择在搜索路径中的第一个符合导入文件名的文件。
1
2
3
4
5
6
7
8
9
10
|
In [ 6 ]: sys.path
Out[ 6 ]:
['', #空字符串代表当前工作目录
'/application/python36/bin' ,
'/application/python36/lib/python36.zip' ,
'/application/python36/lib/python3.6' ,
'/application/python36/lib/python3.6/lib-dynload' ,
'/application/python36/lib/python3.6/site-packages' ,
'/application/python36/lib/python3.6/site-packages/IPython/extensions' ,
'/root/.ipython' ]
|
1.4、包
包用于将一组模块归并到一个目录中,此目录即为包,目录名位包名。包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的应用程序执行环境;基于包,python 在执行模块导入时可以指定模块的导入路径。
1
|
import dir1.dir2.mod1
|
要使用如图所示的 package1,则 py_pkg_mod 容器必须要在模块搜索路径中
1
|
import package1.mod1
|
包导入语句的路径内的每个目录内必须有__init__.py 文件; __init__.py 可以包含代码,但通常为空,仅用于扮演包初始化的挂钩、 替目录产生模块命名空间以及使用目录导入时实现 from *行为的角色。
1.5、模块的属性
每个模块都有个名为__name__的内置属性,python 会自动设置该属性如果文件以顶层程序文件执行, 在启动时,__name__的值为”__main__”;如果是被导入,则__name__的值为模块名。
可以在模块文件中检测自己的__name__属性,以之实现在执行时运行制定的代码或者进行自我测试。
1
2
3
4
|
def testFunc():
print ( 'Hello,there...' )
if __name__ = = '__main__' :
testFunc()
|
1.6、发布python模块或程序
-
Python 模块、扩展和应用程序可以按以下几种形式进行打包和发布
压缩文件(使用 distutils): windows 的 zip 文件和类 unix 的.tar.gz 文件; 自动解包或自动安装可执行程序: windows 中的.exe 文件; 自包含的, 不要求安装的预备运行可执行程序: windows 中的.exe 文件; unix 上带有一个小的脚本前缀的 ZIP 压缩文件等; 平台相关的安装程序: windows 上的.msi 文件、 linux 上常见的.rpm、 src.rpm 等。 |
-
使用 disutils 发布模块
“发布”是指一个文件集合,这些文件联合在一起可使用distutils构建、打包和发布等创建好的发布可用于安装,也可用于上传到 PyPI 与他人分享。
-
创建发布
将各代码文件组织到模块容器中;准备一个README或者README.txt文件;而后在容器中创建setup.py 文件。
在要发布的容器目录中执行”python setup.py sdist”命令。
1
2
3
4
5
6
7
8
9
10
11
|
from distutils.core import setup #setup.py中的代码示例
setup( name = 'hello_py' ,
version = '0.0.1' ,
author = 'mypython' ,
py_modules = [ 'hello' ],
url = 'a.simple.com' ,
description = 'print hello' ,
)
|
获取帮助的方式:
python setup.py --help
python setup.py --help-commands: 所有可以使用的命令, 如 build, install
python setup.py COMMAND --help: 获取特定命令的帮助
python setup.py COMMAND --help-formats: 获取特定命令支持使用的格式
二、常用模块
-
OS 模块
目录: chdir(): 改变工作目录 chroot(): 设定当前进程的根目录 makedirs():创建多级目录 getcwd():返回当前目录下的文件信息 rmdir(): 删除目录 removedirs(): 删除多级目录 |
文件: mkfifo():创建管道 mknod(): 创建nod节点 remove():删除文件 unlink():取消链接 rename(): 重命名 stat(): 返回文件状态信息 symlink():创建符号链接 utime(): 更新时间戳tmpfile():创建并打开(w+b)一个新的临时文件 |
访问权限: access(): 访问权限 chmod(): 修改权限 |
文件描述符: open(): 打开文件描述符 read(): 读取文件 write():写文件 |
设备文件: mkdev():创建设备 major():主节点 minor():次节点 |
os.path: 跟文件路径相关 basename(): 路径基名 dirname(): 路径目录名 join(): 连接多个路径 split():返回dirname(),basename()元组 splitext(): 返回(filename, extension)元组 |
文件信息: getatime():获取访问时间 getctime():获取元数据修改时间 getmtime():获取文件内容修改时间 getsize(): 返回文件的大小 |
查询: exists(): 判断指定文件是否存在 isabs(): 判断指定的路径是否为绝对路径 islink(): 是否符号链接 ismount(): 是否为挂载点 samefile(): 两个路径是否指向了同一个文件 |
-
sys 模块
sys.argv 命令行参数 List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时 exit(0) sys.version 获取 Python 解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') 进度条 val = sys.stdin.readline()[:-1] #从键盘输入设置变量
|
-
shutil高级的文件、文件夹、压缩包处理模块
shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中,可以部分内容 shutil.copyfile(src, dst) 拷贝文件 shutil.copymode(src, dst) 仅拷贝权限。 内容、 组、 用户均不变 shutil.copystat(src, dst) 拷贝状态的信息, 包括: mode bits, atime, mtime, flags shutil.copy(src, dst) 拷贝文件和权限 shutil.copy2(src, dst) 拷贝文件和状态信息 shutil.ignore_patterns(*patterns) shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件 shutil.rmtree(path[, ignore_errors[, onerror]]) 递归的去删除文件 shutil.move(src, dst) 递归的去移动文件 shutil.make_archive(base_name, format,...) 创建压缩包并返回文件路径,例如:zip、tar base_name:压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,如: www =>保存至当前路径 如: /Users/wupeiqi/www =>保存至/Users/wupeiqi/ format: 压缩包种类, “zip”, “tar”, “bztar”, “gztar” root_dir: 要压缩的文件夹路径( 默认当前目录) owner: 用户, 默认当前用户 group: 组, 默认当前组 logger: 用于记录日志, 通常是 logging.Logger 对象
|
-
xml 处理模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json 差不多,但 json 使用起来更简单; xml的格式如下,就是通过<>节点来区别数据结构的。
1
2
3
4
5
6
7
8
|
<? xml version = '1.0' ?>
< menu >
< user id = "0" >
< name >Alexia</ name >
< age >23</ age >
< sex >Female</ sex >
</ user >
</ menu >
|
-
ConfigParser 模块
用于生成和修改常见配置文档。
1
2
3
4
5
6
7
8
|
[english] #配置文件样式
greeting = Hello
[french] greeting = Bonjour
[files] home = / usr / local
# simple interpolation: bin = % (home)s / bin
|
-
yaml 模块
与 json 相似、 同样有键值。 主要用来处理日期和时间这样的数据类型。
load()将yaml 字符串转换为python 数据; dump()相反,将python 数据转换为yaml字符串。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
name: #yaml文件样式
first: James
last: McIntyre
dates: birth: 1828 - 05 - 25
death: 1906 - 03 - 31
details: bearded: true
themes: [cheese, Canada]
books: url: http: / / www.gutenberg.org / files / 36068 / 36068 - h / 36068 - h.htm
poems: - title: 'Motto'
text: |
Politeness, perseverance and pluck,
To their possessor will bring good luck.
- title: 'Canadian Charms'
text: |
Here industry is not in vain,
For we have bounteous crops of grain,
And you behold on every field
Of grass and roots abundant yield ,
But after all the greatest charm
Is the snug home upon the farm,
And stone walls now keep cattle warm.
|
-
hashlib 模块
用于加密相关的操作,3.x里代替了md5 模块和 sha 模块,主要提供 SHA1,SHA224,SHA256, SHA384,SHA512,MD5算法。python还有一个hmac模块,它内部对我们创建 key和内容再进行处理然后再加密散列消息鉴别码,简称HMAC,是一种基于消息鉴别码 MAC(Message Authentication Code) 的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别** K 来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好 key,就像接头暗号一样,然后消息发送把用 key 把消息加密,接收方用key + 消息明文再加密,拿加密后的值跟发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
1
2
3
4
5
6
7
8
9
|
In [ 7 ]: import hmac
In [ 8 ]: h = hmac.new(b '1213' ,b '45678' )
In [ 9 ]: print (h.hexdigest)
<bound method HMAC.hexdigest of <hmac.HMAC object at 0x7f3441dd1048 >>
In [ 10 ]: print (h.hexdigest())
da66020747fb19dec23ba317f759d2de |
-
Subprocess 模块
#生成新进程, 连接输入/输出/错误管道。
1
|
>>> retcode = subprocess.call([ "ls" , "-l" ])
|
#执行命令, 如果命令结果为 0, 就正常返回, 否则抛异常
1
|
>>> subprocess.getstatusoutput( 'ls /bin/ls' )
|
#接收字符串格式命令, 返回元组形式, 第 1 个元素是执行状态, 第 2 个是命令结果
1
|
>>> subprocess.getoutput( 'ls /bin/ls' )
|
#接收字符串格式命令, 并返回结果
1
|
>>> res = subprocess.check_output([ 'ls' , '-l' ])
|
#执行命令,并返回结果,注意是返回结果,不是打印,下例结果返回给res
底层都是封装的 subprocess.Popen
1
2
3
4
|
poll() #检查子进程是否已终止。返回returnCode
wait() #等待子进程终止。返回returnCode属性。
terminate() #杀掉所启动进程
communicate() #等待任务结束
|
subprocess.Popen() #打开子进程
args:shell 命令,可以是字符串或者序列类型( 如: list, 元组) bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲 stdin, stdout, stderr: 分别表示程序的标准输入、输出、错误句柄 preexec_fn:Unix平台下有效,用于指定可执行对象,它将在子进程运行之前被调用 close_sfs:windows 平台下,close_fds 被设置为 True时,则新创建的子进程将不会继承父进程的输入、输出、错误管道。所以不能将 close_fds 设置为 True 同时重定向子进程的标准输入、 输出与错误。 shell:同上 cwd: 用于设置子进程的当前目录 env: 用于指定子进程的环境变量。env = None,子进程的环境变量将从父进程中继承。 startupinfo与 createionflags只在windows下有效将被传递给底层的 CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。 |
-
logging
用于便捷记录日志且线程安全的模块。
1
2
3
4
5
6
|
logging.basicConfig(filename = 'log.log' , #设置日志文件
format = '%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s' , #日志格式
datefmt = '%Y-%m-%d %H:%M:%S %p' , #时间戳
level = 10 ) #日志等级
logging.debug( 'debug' ) logging.info( 'info' ) logging.warning( 'warning' )
logging.error( 'error' ) logging.critical( 'critical' ) logging.log( 10 , 'log' )
|
日志等级:
1
2
3
4
5
6
7
8
|
CRITICAL = 50 FATAL = CRITICAL
ERROR = 40 WARNING = 30
WARN = WARNING
INFO = 20 DEBUG = 10 NOTSET = 0
|
Python 使用 logging 模块记录日志涉及四个主要类:
logger 提供了应用程序可以直接使用的接口; handler 将(logger 创建的)日志记录发送到合适的目的输出; filter 提供了细度设备来决定输出哪条日志记录; formatter 决定日志记录的最终输出格式。 |
LOG=logging.getLogger(”chat.gui”) LOG=logging.getLogger(”chat.kernel”) Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。 Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的 filter Logger.addHandler(hdlr)、 Logger.removeHandler(hdlr):增加或删除指定的 handler可以设置的日志级别: Logger.debug()、 Logger.info()、 Logger.warning()、 Logger.error()、 Logger.critical(): |
handler 对象负责发送相关的信息到指定目的地。Python 的日志系统有些 Handler 可以把信息输出到控制台,有些 Logger 可以把信息输出到文件,还有些 Handler 可以把信息发送到网络上。
logging.StreamHandler 向类似与 sys.stdout 或者 sys.stderr 的任何文件对象(file object)输出信息。 logging.FileHandler 用于向一个文件输出日志信息。 不过 FileHandler 会帮你打开这个文件。 logging.handlers.RotatingFileHandler 类似于上面的 FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。 logging.handlers.TimedRotatingFileHandler 与RotatingFileHandler 类似,但它是间隔一定时间就自动创建新的日志文件。重命名的过程与 RotatingFileHandler 类似,不过新的文件不是附加数字,而是当前时间。 |
本文转自 梦想成大牛 51CTO博客,原文链接:http://blog.51cto.com/yinsuifeng/1914524,如需转载请自行联系原作者