Python 2.7 学习笔记 模块和包

我们来考虑下如下几种场景:

1、编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中。但如果程序功能比较多,可能需要多个python文件来组织源代码。而这些文件之间的代码肯定有关联,比如一个文件中的python代码调用另一个python文件中定义的函数。

2、我们编写程序,肯定不会所有的东西都自己写,不会全部重造轮子,我们肯定会用到Python提供的一些标准库。那怎么使用呢?其实前面的文章中已经看到了,用import语句。 如同java中用import,c#中用using语句。

3、我们自想编写一个公共代码,或从外部找到一个第三方的公共代码,如何放入到整个python系统中,如何被自己编写的代码使用。

上面这些场景,都是在编写程序时常见的事情。

这些问题,python是通过模块和包的机制来解决的。

简单的说,一个模块就是一个python文件,一个包是包含一组模块。下面我们通过实际的例子来说明。

一、案例1:一个最简单例子

编写 test1.py文件,代码如下

#coding=utf-8
import test2
print "hello"
test2.fun("world")

编写test2.py文件,代码如下

#coding=utf-8
def fun(para):
    print para

这两个python文件位于同一目录,但不一定要在python的相关系统目录下,可以是任意的合法目录。

这时我们执行 test1.py,可以成功运行。
可以看出,test1.py中的代码 调用了 test2.py中的 fun方法,这能够调用的关键是在test1.py中 import test2这个语句,表示将test2.py这个模块引入进来,

同时调用时是通过  模块名.函数名 调用的。

二、案例2: 如何放置模块

上面的例子,是两个python文件位于同一目录下。如果test2.py想放在其它目录下怎么办呢?

这里关键是让python解释器能找到 test2.py。

这种情况很常见,比如 test2.py是个通用的模块,可以被多个程序使用,那它就不能与使用它的程序放在一起,否则就要拷贝多份了。

将test2.py 放在其它地方,有多种方法,下面分别介绍。

方法一:放在python已有的系统目录下

把模块(python文件)放在python的系统目录下,引入模块时,python解释器就能找到。

可以通过如下的代码查看当前有哪些系统目录:

>>> import sys,pprint
>>> pprint.pprint(sys.path)
[‘‘,
 ‘C:\\Python27\\lib\\site-packages\\pip-7.1.2-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\paramiko-1.15.2-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\robotframework_sshlibrary-2.1.1-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\ecdsa-0.13-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\selenium-2.47.1-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\decorator-4.0.2-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\easyprocess-0.1.9-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\webtest-2.0.20-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\beautifulsoup4-4.4.1-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\waitress-0.8.10-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\webob-1.5.1-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\six-1.10.0-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\jsonpointer-1.10-py2.7.egg‘,
 ‘C:\\Python27\\lib\\site-packages\\jsonpatch-1.12-py2.7.egg‘,
 ‘C:\\Windows\\system32\\python27.zip‘,
 ‘C:\\Python27\\DLLs‘,
 ‘C:\\Python27\\lib‘,
 ‘C:\\Python27\\lib\\plat-win‘,
 ‘C:\\Python27\\lib\\lib-tk‘,
 ‘C:\\Python27‘,
 ‘C:\\Python27\\lib\\site-packages‘,
 ‘C:\\Python27\\lib\\site-packages\\win32‘,
 ‘C:\\Python27\\lib\\site-packages\\win32\\lib‘,
 ‘C:\\Python27\\lib\\site-packages\\Pythonwin‘]

python的 标准库 sys模块中的path对象包含了所有的系统路径,利用 pprint模块中的pprint方法可以格式化的显示数据,如果用内置语句print则只能在一行显示所有内容,查看不方便。
我们只要把python文件(如本文例子中的test2.py)放在上述任何目录下,python解释器就能找到。

注意:必须直接放在上述目录下,不能建立子目录,放在子目录下。要想能放到子目录下,就是包的概念,下面会介绍。

方法二:新增系统目录

除了python自己默认的一些系统目录外,应用程序也可以通过代码添加系统目录。

因为系统路径是存在 sys.path对象下的,path对象是个列表,就可以自己通过代码往其中插入目录,如

sys.path.append("D:/demo/python/dir")

但很显然,插入的这个目录作为系统目录只能对当前程序生效,因为这只是在内存中生效。

方法三:设置环境变量

如果我们不想把代码放在python的系统目录下,以免和python的目录混在一起,增加管理的复杂性。

甚至有的时候,因为权限的原因,还不能在python的系统目录下加文件。

而希望放在自己规划的目录下。 这时就可以操作系统的 PYTHONPATH 环境变量,所有甚至到该环境变量下的目录都能被python解释器搜到。

这样我们就可以将代码放到PYTHONPATH 环境变量包含的目录下,就可以被别的程序import了。

设置PYTHONPATH 环境变量是相对比较好的方式,推荐使用。

案例三:路径的优先级

根据上面的介绍,一个模块要能别的程序引用(import)到,可以和程序放在一个目录,可以放到python系统目录下,可以放到PYTHONPATH 环境变量包含的目录下,那哪个优先级最高。

这时我们可以测试下,写三个同名文件,文件中定义同名的函数,函数只有一个print语句,但三个文件中的函数的print语句内容不同。

再编写另外一个程序import上面这个文件,并调用定义的函数,看看输出,就知道优先级了。

经过测试,发现优先级从高到底分别是:

1)当前目录

2)环境变量PYTHONPATH包含的路径

3)python系统目录

这个其实也很好理解,正常情况,越是用户的设置优先级越高。

案例四:包

我们上面的介绍,每个模块都是独立的一个python文件。为了让python能发现他们,必须放在相应的目录下。

没有分层,容易造成命名冲突和管理上的混乱。

特别在实际情况下,一个功能往往由多个模块(文件)组成,一般我们希望把这些代码放在一个目录下,便于管理。

这就要用到python的包的机制了。

python的包,物理上是一个目录,它实际上也是一个模块,只是比较特殊的模块,就是它还能包含其它模块。

下面我们举例来说明:

我们创建一个目录,如 testpackage

要想这个目录成为一个python包,需要在该目录下创建一个文件 __init__.py , init的前后分别是两个连续的下划线。

内容如:

#coding=utf-8
print "hello,i am package"
def hello():
    print "good"

我们再在testpackage所在的目录下建立一个test.py文件,内容如下

#coding=utf-8
import testpackage
testpackage.hello()

test.py中就导入了testpackage,这时我们执行test.py,发现输出:
hello,i am package
good

可以看出,testpackage就是一个特殊的模块,但因为它本身不是一个python文件,而是一个目录,那么它下面的__init__.py 就是模块的内容,导入包,其实就是导入__init__.py文件。 而普通模块对应的是python文件,要求模块名和文件名一致。

我们再在 testpackage 下建立两个文件,module1.py , module2.py ,内容分别是:

#coding=utf-8
def fun1():
    print "module1"
#coding=utf-8
def fun2():
    print "module2"

下面我们来使用这两个模块,修改test.py文件。修改后的test.py的内容如下:

#coding=utf-8
import testpackage
import testpackage.module1
from testpackage import module2
testpackage.hello()
testpackage.module1.fun1()
module2.fun2()

执行test.py的输出如下:
hello,i am package
good
module1
module2

下面我们来分析下test.py中的内容

可以看出,我们用两种不同的方式导入了module1模块和 module2模块。

采用import testpackage.module1 方式,则要求在使用module1中的函数等时,需要全路径引用,如testpackage.module1.fun1()。

采用from testpackage import module2方式,则要求在使用module2中的函数等时,可以省略包名引用,如module2.fun2()。

一般情况下,我们采用from导入的方式。

还有一点需要说明的是,导入包中的模块,这时就不再需要导入包,因为会自动先导入模块所在的包,也就是说会自动导入包的__init__.py文件。

另外一点,既然包是一个特殊的模块,它的存放和普通模块一样,可以和用它的程序在一个目录下,可以在python系统目录下,也可以放到环境变量PYTHONPATH包含的目录下。

有了包这个功能,对于复杂的程序,就可以更好的组织源代码。

案例五:模块中能放什么呢?

在前面的例子中,已经涉及到了一些内容,下面我们再来更为详细的介绍下模块中能放什么,怎么用的问题。

第一,模块中能放什么,理论上说,跟普通的python代码文件一样,可以放 变量、函数定义、类定义,甚至直接的语句调用等内容。

按道理,除了被执行的那个python文件外,其它的python文件都是模块。

第二,用的问题。首先就要被导入。

被导入时,模块中直接写的语句,如 print就会被立即执行,变量等也会被定义和初始化(如果有的话)。

时间: 2024-08-11 03:02:26

Python 2.7 学习笔记 模块和包的相关文章

python网络爬虫学习笔记

python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章目录 1. 介绍: 2. 从简单语句中开始: 3. 传送数据给服务器 4. HTTP头-描述数据的数据 5. 异常 5.0.1. URLError 5.0.2. HTTPError 5.0.3. 处理异常 5.0.4. info和geturl 6. Opener和Handler 7. Basic Authentication 8. 代理 9. Timeout 设置 10. Cookie 11. Deb

Python学习笔记-模块介绍(三)-模块包和搜索路径

一个python文件就是一个模块,使用独立的命名空间,但实际使用过程中单单用模块来定义python功能显然还不够.因为一个大型的系统几千上万个模块是很正常的事情,如果都聚集在一起显然不好管理并且有命名冲突的可能,因此python中也出现了一个包的概念. 一.python中的包介绍 包是通过使用"点模块名称"创建Python模块命名空间的一种方法.列如,模块名称 A.B 表示一个在名为 A的包下的名为B的子模块.就像使用模块让不同模块的作者无需担心彼此全局变量名称(冲突)一样,点模块名称

Python学习笔记-模块介绍(一)-模块概念和基本使用

python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了系统默认的模块不需要导入外.导入直接使用如下语法: import 模块名称(不要.py后缀) 这样导入成功后,就可以在另外一个模块中使用被导入模块的功能函数或对象了.先举例如下,比如在D:\temp目录下建立python模块:module_1.py,内容如下: # -*- c

Python学习笔记-模块介绍(二)-模块导入和执行

之前的一篇博文介绍了python中模块的概念和基本使用方法,模块作为python语言中的基本单元,可以用来编写公用库函数或对象以便重复使用.同时模块还可以作为独立文件进行运行,之前也已经提到,只要是导入了模块文件,那么PVM就会依次执行模块文件中的所有语句.本篇主要介绍模块使用的一些进阶,首先定义一个模块module_2.py,内容如下: # -*- encoding:utf-8 -*-'''module_2.py模块的内容''' print(__name__) def sum(a,b):ret

python数据分析入门学习笔记儿

学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分析相关python库的介绍(前言1~4摘抄自<利用python进行数据分析>) 1.Numpy: Numpy是python科学计算的基础包,它提供以下功能(不限于此): (1)快速高效的多维数组对象naarray (2)用于对数组执行元素级计算以及直接对数组执行数学运算的函数 (3)用于读写硬盘

Python高级特性——学习笔记

Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 1.切片slice.L = [1, 2, 3, 4, 5] L[0:3]=[1,2,3]表示,从索引0开始取,直到索引3为止,但不包括索引3.即索引0,1,2,正好是3个元素. 如果第一个索引是0,还可以省略 倒数切片L[-2:]=[4,5]从倒数第二个数 到 最后一个数 L = list(range(100))# 创建一个0-99的数列L L[:10:2]# 前10个数,每两个取一个

python web框架学习笔记

一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket def handle_request(client): #接收请求 buf = client.recv(1024) print(buf) #返回信息 client.send(bytes('<h1>welcome liuyao webserver</h1>','utf8')) def main(): #创建sock对象 sock

Python 安装第三方库,模块和包的安装方法

在python中已经内置了很多的有用的模块,只要安装了python的开发工具,这些模块就可以立刻使用了.而在实际python开发的过程中,除了python内置的模块外,python还有大量的第三方的库.模块和包. 常用的第三模块都会在python的PyPI - the Python Package Index上进行注册,只要找到对应模块的名字就可以进行安装了. 由于最近需要通过python来创建PDF文档,但是由于python的内置模块中相关的模块,所以需要使用第三方的reportlab库来创建

&lt;&lt;Python基础教程&gt;&gt;学习笔记之|第01章|基础知识

本学习笔记主要用要记录下学习<<Python基础教程>>过程中的一些Key Point,或自己没怎么搞明白的内容,可能有点杂乱,但比较实用,查找起来也方便. 第01章:基础知识 ------ Jython:      Python的Java实现,运行在JVM中,相对稳定,但落后于Python,当前版本2.5,在TA(Python+Robot)会用到 IronPython:  Python的C#实现,运行在Common Language Runtime,速度比Python要快 >