16 模块与包
模块首先是一个含有源代码的文件在Python里以.py结尾,文件里可以有函数的定义、变量的定义或者对象(类的实例化)的定义等等内容。如果一个项目的代码量较大,函数较多,最好把一个文件分为多个文件来管理,这样总程序脉络清晰易于维护和团队分工协作,这就是Python里存在模块的意义所在。模块名就是文件名(不含.py),例如假设有一个模块:xopowo.py那么模块名为xopowo。
但当一个项目的模块文件不断的增多,为了更好地管理项目,通常将功能相近相关的模块放在同一个目录下,这就是包,故包从物理结构上看对应于一个目录,一个特殊要求,包目录下必有一个空的__init__.py文件,这是包区分普通目录的标签或者说是标志。包下可以又有包称为子包,子包也是一个目录,子包的目录下也得有一个空的__init__.py文件。这样就构成了分级或者说分层的项目管理体系。
16.1 模块的使用
模块,可是Python自带的、而外安装的或者开发者自己写的,在一个文件里使用模块很简单用import即可,import有点像C语言的include。
以Python2的内建模块datetime为例,讲解一下模块的基本使用。
在新程序里使用datetime模块可以有两种方式:方式一是把模块引入,而模块里的函数的使用需要用点运算的方式来来使用。
import datetime
birthday = datetime.date(2011,7,23)
print birthday
而文件引用模块里某函数还有另外一种方式就是用from import来直接引入某模块里的某函数,即方式二。
from datetime import date,time
birthday = date(2011,7,23)
print birthday
使用方式二文件只能用import后列出的函数,而模块datetime里的其他函数无法在本文件里使用,所以一种特殊的写法如下:
from datetime import *
也就是说datetime里的所有函数在本程序里均可使用。
16.2 包的使用
包,实际是更大规模的以目录形式存在的模块集合,包可以含子包,包区别于目录是包的目录下有一个空的__init__.py文件。包和模块一样有Python自带的包,也可以通过工具安装一些包,例如numpy就是数据科学领域比较常用的一个包,需额外安装,当然也可以自己开发一些包。
以Python2自带的包multiprocessing为例,其下还有子包dummy。
liao@liao:/usr/lib/python2.7/multiprocessing$ ls
connection.py forking.py heap.pyc managers.py pool.pyc queues.py reduction.pyc synchronize.py
connection.pyc forking.pyc __init__.py managers.pyc process.py queues.pyc sharedctypes.py synchronize.pyc
dummy heap.py __init__.pyc pool.py process.pyc reduction.py sharedctypes.pyc util.py
liao@liao:/usr/lib/python2.7/multiprocessing$ ls dummy/
connection.py connection.pyc __init__.py __init__.pyc
liao@liao:/usr/lib/python2.7/multiprocessing$
multiprocess包下有很多的模块,例如process模块,那么可以在一个示例程序里使用包multiprocess里的process模块。
#coding:utf-8
from multiprocessing import Process
import os
def test(name):
print "Process ID: %s" % (os.getpid())
print "Parent Process ID: %s" % (os.getppid())
if __name__ == "__main__":
proc = Process(target=test, args=('nmask',))
proc.start()
proc.join()
需要解释的是from multiprocessing import Process
是从包multiprocess里引入Process, 但Process类定义在process.py文件里,包含Process类的process.py文件是在multiprocessing目录下的,故是multiprocessing包里的一个模块。通过Python交互环境可以查明这一点。
>>> from multiprocessing import Process
>>> help(Process)
Help on class Process in module multiprocessing.process:
class Process(__builtin__.object)
代码from multiprocessing import Process
也可以这样去写from multiprocessing.process import Process
这样写既写了包名又写了模块名即包.模块
,其实在Python里一般还是直接用包名(偷懒),而少有既写包又写模块的。
16.3 模块或包的安装
Python有大量的第三方的模块(包)可以通过Python的setuptools工具里的easy_intall或pip工具在线安装所需的模块,个人推荐使用pip更好! 在windows下安装pip或者通过pip安装其他模块需要在命令行模式下运行即cmd弹出的黑色对话框里执行各项命令,故首先得配置好环境,至少在cmd里能首先能执行python,如果在cmd里键入python都出错的话,说明cmd环境无法识别python。
原因很简单系统的环境变量里没有python的路径,需要首先配置好系统环境变量能够找到python。步骤:“我的电脑”右键“属性”,在“高级”对话框下找到“环境变量”,在环境变量对话框里找到“系统变量”, 在其下的列表里找到"Path"点击“编辑”按钮,在变量值的最后键入;C:\Python27
,请注意分号(;)。(假设本机python安装在c盘的python2.7目录下。)最后确认即可。
重新打开cmd键入python,如下图所示。
键入python后出现了>>>说明cmd识别了python。
16.3.1 easy_install的安装
python的环境配置好了以后便可以安装easy_install了,一个简单的办法是通过ez_setup.py文件来安装easy_install工具,下载ez_setup.py文件后,只需在cmd下的ez_setup.py文件所在的目录下执行python ez_setup.py install
即可安好easy_install了。
是否已安装好easy_install
安装之前可以查看一下本机是否已经安装过easy_install,可以在cmd下键入easy_install查看一下。
安装easy_install
在cmd下切换到ez_install.py的所在目录,然后键入python ez_install.py install
回车之后即开始安装。
easy_install配置
easy_install安装完毕之后,打开cmd键入easy\_install
之后会报错,如下图:
需要配置一下,将easy_install所在的目录配置到系统变量Path里,即给Path的值尾部加上;C:\Python27\Scripts
,然后再cmd里就可找到easy_install就能用了。
easy_install的另一种安装方法
可以从其官方下载安装包.tar.gz,解压,在cmd下进入该解压目录,然后执行python setup.py install
也完成对easy_install的安装。
16.3.2 pip的安装
首先下载pip的安装包,pip官方下载地址下载.tar.gz文件并解压,然后进入解压目录用python setup.py install进行安装pip。
或者在安装完了easy_install之后用easy_install来安装pip,命令如下:
easy_install pip
windows用户安装pip
首先是python能够被cmd识别即配置好Python,需要在系统变量Path里增;C:\Python27
,pip安装完毕后需要增加;C:\Python27\Scripts
。
Linux用户安装pip
Linux用户安装pip比较简单,在shell下用aptitude或apt-get即可完成pip的安装,无需任何配置。
$ sudo apt-get install python-pip
这里说句题外话,用Python早晚要在Linux下用它去工作,读者朋友们,早点学习、了解Linux吧,用Linux惊喜不断,且高大上。
16.3.3 安装第三方模块
有了easy_install或者pip之后,就可安装其他模块或者包了,以pip为例安装numpy包命令如下:
pip install numpy
在cmd里键入如上命令即可完成,是否安装成功,在python的代码或者交互环境里import numpy
看看有没有报错说没有该模块即可判断出是否安装第三方模块numpy是否成功。
感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!