您的位置:首页 > 编程语言 > Python开发

Python中的模块和包

2014-06-02 11:47 423 查看

1.导入模块

任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索:在当前所在目录下搜索这个模块

在环境变量
PYTHONPATH
中指定的路径列表中依次搜索

在Python安装路径中去搜索

根据Python的搜索路径的方式,想让Python解释器找到自定义的模块可以使用下面的三种方式(不包含模块在当前目录的方式):

1.1 将模块放置在默认的目录

Python解释器会在默认目录中查找需要使用模块,使用
sys
模块的
path
变量即可查看解释器默查找的目录,如下:

1 import sys 2 import pprint 3  4 pprint.pprint(sys.path)
5 # output: 6 # ['C:\\Users\\gyzhao\\Desktop', 7 #  'C:\\Python27\\lib\\site-packages\\distribute-0.6.27-py2.7.egg', 8 #  'C:\\Windows\\system32\\python27.zip', 9 #  'C:\\Python27\\DLLs',10 #  'C:\\Python27\\lib',11 #  'C:\\Python27\\lib\\plat-win',12 #  'C:\\Python27\\lib\\lib-tk',13 #  'C:\\Python27',14 #  'C:\\Python27\\lib\\site-packages',15 #  'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info']


一般情况下应该存放到
site-packages
目录中,这里用于存放标准库外的第三方模块。

1.2 在程序中直接设置模块目录

我们在任意位置创建一个文件夹,用于存放自定义的模块,这里是
C:/Python
,在这个目录中新增一个
Hello.py
文件,内容如下:
# hello.pydef hello():    print "hello,world!"
同样的通过将模块所在的目录添加到
sys
模块的
path
变量中即可,这样就可以使用这个模块中定义的函数:
import sys
sys.path.append('c:/python')import hello

hello.hello() # hello,world!

1.3 修改环境变量

还可以通过修改环境变量,来告知Python解释器自定义模块的位置:
我的电脑 --> 属性 --> 高级 --> 环境变量
添加
PYTHONPATH
变量,多个目录使用
;
分开即可,如下:

这样我们就可以直接使用
hello
模块了:
import hello

hello.hello() # hello,world!

1.4 补充:Sublime Text下环境变量的配置

如果使用使用Sublime Text来编写Python代码的话,使用第三种方式,即修改
PYTHONPATH
变量的方式,在
Ctrl+B
运行代码时,会找不到环境变量里面声明路径中定义的模块,这是Sublime Text自身的问题,因为不管使用使用Python自带的IDLE,还是CMD来执行代码,都是可以通过
PYTHONPATH
变量来找到其声明路径中的模块的,如果想要在Sublime Text中通过环境变量来使用第三方模块的话需要显式的在Sublime Text的
Python.sublime-build
文件中声明,步骤如下:
Preferences --> Browse Packages... --> 找到Python文件夹 --> 打开Python.sublime-build文件
将将路径添加到
env
属性中,多个路径使用
;
分隔,修改如下:

{
"cmd": ["python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"env":{
"PYTHONPATH":"C:\\Python;"
}
}


2. 在模块中增加测试代码

有时候我们需要在模块中添加测试代码,可以直接执行检测模块是否正确工作。但是在程序作为模块被其他程序引用时,不执行这些测试代码,通过使用
__name__
变量我们可以很容易的实现这点:

1 # -- coding: utf-8 -- 2  3 def hello(): 4     print "hello,world!" 5  6 def test(): 7     hello() 8 # 如果作为程序运行,Hello函数会被执行, 9 # 作为模块时不执行,因为这时:__name__ = hello10 if __name__ == '__main__': test()


3. 了解模块具体内容

在使用一个模块前,我们应该首先去了解这个模块的具体内容,这样能节省很多的时间,避免在没有了解模块具体内容的情况下,盲目的编写代码。使用下面的几种办法可以让我们很快的对一个模块建立大体的印象。

3.1 使用dir

查看模块包含的内容可以使用
dir
函数,它会将对象(模块所有函数、类、变量等)的所有特性列出来,如下:

1 # -- coding: utf-8 -- 2 import sys 3  4 # 通过列表推导式过滤内部成员 5 publicMembers = [n for n in dir(sys) if not n.startswith('_')] 6  7 for m in publicMembers: 8     print m+'' 9 10 # output11 # api_version12 # argv13 # ...


3.2 使用all变量

__all__
变量定义了模块的公有接口(public interface),如下:
# -- coding: utf-8 --import copy# output: ['Error', 'copy', 'deepcopy']print copy.__all__
__all__
变量等于告诉解释器:从模块导入所有内容(使用
*
)时,即下面的形式:
from copy import *
那就只能使用
__all__
定义的函数。如果使用
__all__
没有定义的成员,只要显式的导入即可。如果导入的模块没有定义
__all__
变量,使用
import *
语句默认将会输出模块中所有不以下划线(
_
)开头的全局名称。

3.3 查看文档字符串

通过
__doc__
变量,我们可以查看一个
range
函数的文档字符串:
# -- coding: utf-8 --print range.__doc__
不是每个模块和函数都有清晰的文档字符串,如果想要更清楚的了解一些模块和函数时如果工作的,应该参阅Python库参考(http://docs.python.org/2/library/index.html),这里有更标准、详尽的信息。

3.4 使用help获取帮助

help函数和之间检测文档字符串相比,help函数能获取更多的信息,比如函数签名等:
# -- coding: utf-8 --import copyprint help(copy.copy)

3.5 阅读源代码

除了自己动手编写代码外,阅读源代码是学习Python最好的方式。如果想要查看一个模块的源码位置,可以这样:
# -- coding: utf-8 --import csvprint csv.__file__ # C:\Python27\lib\csv.pyc
查询处理的文件是
.pyc
后缀结尾的文件,这是一个经过Python解释器处理后生成的字节码文件,我们只需要查看对于的以
.py
后缀结尾的源文件即可。

4. 组织模块的形式——包

为了进一步的组织好模块,可以将它们分组为包。包基本上就是一类模块。当模块存储在文件中时,包就是模块所在的目录。为了能够让Python解释器将其作为包来对待,它必须包含一个命名为
__init__.py
的文件。如果将它作为普通模块导入的话,文件的内容就是包的内容。__init__.py文件可以为空,不过,一般它时而会包含一个__version__的变 量,保存这个包的版本信息,另外还有一个__all__的列表,包括要import 时要导入的模块。当然,__init__.py的内容不是绝对的,也可以什么都不写,还可以加上其它任何自己认为需要的代码。下面是一个简单的包布局,包名为"drawing",其中包含名为"color"和"shapes"的模块:
C:\Python # 存放模块的路径C:\Python\drawing #包目录(drawing包)C:\Python\drawing\__init__.py # 包代码C:\Python\drawing\colors.py # colors模块C:\Python\drawing\shapes.py # shapes模块
配置好包之后,可以按照以下方式导入包的内容:
# -- coding: utf-8 --import drawing # 导入drawing包import drawing.colors # 导入drawing包的colors模块from drawing import shapes # 导入drawing包的shapes模块

参考资料&进一步阅读

Python基础教程(第二版)http://docs.python.org/2/using/windows.htmlhttp://stackoverflow.com/questions/3701646/how-to-add-to-the-pythonpath-in-windows-7http://docs.sublimetext.info/en/latest/reference/build_systems.html

转自:http://www.cnblogs.com/IPrograming/archive/2013/11/24/Python_module_package.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python module package