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是否成功。