【循序渐进学Python】10.模块和包
1.导入模块
任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索:
- 在当前所在目录下搜索这个模块
- 在环境变量
PYTHONPATH中指定的路径列表中依次搜索 - 在Python安装路径中去搜索
根据Python的搜索路径的方式,想让Python解释器找到自定义的模块可以使用下面的三种方式(不包含模块在当前目录的方式):
1.1 将模块放置在默认的目录
Python解释器会在默认目录中查找需要使用模块,使用 sys 模块的 path 变量即可查看解释器默查找的目录,如下:
import sys
import pprint pprint.pprint(sys.path)
# output:
# ['C:\\Users\\gyzhao\\Desktop',
# 'C:\\Python27\\lib\\site-packages\\distribute-0.6.27-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\\setuptools-0.6c11-py2.7.egg-info']
一般情况下应该存放到 site-packages 目录中,这里用于存放标准库外的第三方模块。
1.2 在程序中直接设置模块目录
我们在任意位置创建一个文件夹,用于存放自定义的模块,这里是 C:/Python ,在这个目录中新增一个 Hello.py 文件,内容如下:
# hello.py
def 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__ 变量我们可以很容易的实现这点:
# -- coding: utf-8 -- def hello():
print "hello,world!" def test():
hello()
# 如果作为程序运行,Hello函数会被执行,
# 作为模块时不执行,因为这时:__name__ = hello
if __name__ == '__main__': test()
3. 了解模块具体内容
在使用一个模块前,我们应该首先去了解这个模块的具体内容,这样能节省很多的时间,避免在没有了解模块具体内容的情况下,盲目的编写代码。使用下面的几种办法可以让我们很快的对一个模块建立大体的印象。
3.1 使用dir
查看模块包含的内容可以使用 dir 函数,它会将对象(模块所有函数、类、变量等)的所有特性列出来,如下:
# -- coding: utf-8 --
import sys # 通过列表推导式过滤内部成员
publicMembers = [n for n in dir(sys) if not n.startswith('_')] for m in publicMembers:
print m+'' # output
# api_version
# argv
# ...
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 copy print help(copy.copy)
3.5 阅读源代码
除了自己动手编写代码外,阅读源代码是学习Python最好的方式。如果想要查看一个模块的源码位置,可以这样:
# -- coding: utf-8 --
import csv print csv.__file__ # C:\Python27\lib\csv.pyc
查询处理的文件是.pyc后缀结尾的文件,这是一个经过Python解释器处理后生成的字节码文件,我们只需要查看对于的以.py后缀结尾的源文件即可。
4. 组织模块的形式——包
为了进一步的组织好模块,可以将它们分组为包。包基本上就是一类模块。当模块存储在文件中时,包就是模块所在的目录。为了能够让Python解释器将其作为包来对待,它必须包含一个命名为__init__.py的文件( __ init__.py 可以只是一个空文件,但是它也可以执行包的初始化代码,包括设置__all__变量等)。如果将它作为普通模块导入的话,文件的内容就是包的内容。
下面是一个简单的包布局,包名为"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模块
5. 使用包管理工具——pip
pip 是一个用来管理Python包的工具。我们可以利用它来帮助我们安装、升级、卸载Python的第三方扩展包。
1. 安装pip
首先需要下载get-pip.py这个文件,然后在控制台中使用Python命令来运行这个文件,即可进行安装:
python get-pip.py
更多安装的细节可以参考:https://pip.pypa.io/en/latest/installing.html
2. 配置环境变量
安装完pip之后,我们可以在Python的安装根目录下面看一个Scripts文件夹,这时候我们将该文件的磁盘路径,例如:
C:\Python27\Scripts
添加到系统的Path环境变量中即可。
3. 管理包(安装、升级、卸载)
配置了环境变量之后,我们就可以在控制台中运行pip命令来对包进行管理了,例如:
pip install SomePackage # 安装一个包
pip install --upgrade SomePackage # 升级一个包
pip uninstall SomePackage # 卸载一个包
更多pip的使用细节,可以参考:https://pypi.python.org/pypi/pip/
参考资料&进一步阅读
http://docs.python.org/2/using/windows.html
http://stackoverflow.com/questions/3701646/how-to-add-to-the-pythonpath-in-windows-7
http://docs.sublimetext.info/en/latest/reference/build_systems.html
https://pypi.python.org/pypi/pip/
【循序渐进学Python】10.模块和包的更多相关文章
- Python之模块和包导入
Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...
- 一文搞懂 Python 的模块和包,在实战中的最佳实践
最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...
- 第10章 Python的模块和包
前面几章介绍的Python基础知识,相关案例都是以单源代码文件为例来说明的,这种单源代码文件在Python中就是模块,每个模块文件都可以被其他应用导入,Python正是通过模块导入技术来实现很灵活的功 ...
- (Python )模块、包
本节开始学习模块的相关知识,主要包括模块的编译,模块的搜索路径.包等知识 1.模块 如果我们直接在解释器中编写python,当我们关掉解释器后,再进去.我们之前编写的代码都丢失了.因此,我们需要将我们 ...
- day21 python之模块和包
一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...
- Python之模块和包
一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...
- 《Python》模块和包
一.模块 1.什么是模块: 一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编写的代码(. ...
- python基础----模块、包
一 模块 ...
- Python基础-模块与包
一.如何使用模块 上篇文章已经简单介绍了模块及模块的优点,这里着重整理一下模块的使用细节. 1. import 示例文件:spam.py,文件名spam.py,模块名spam #spam.py pri ...
随机推荐
- parallels无法启动之大乌龙-流水账版
欢迎访问我的blog:blog.thinkinside.me 早上到公司,像往日一样,开电脑倒茶喝水. 回到座位打开parallels desktop,发现不对,打开PD非常的慢.显示正在初始 ...
- LCLFramework框架之Plugin模式
插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...
- Flash Builder中“Error: #2036 加载未完成”错误的解决方法
复制了一个名称为A的widget包,重命名为B,包含B.mxml和B.xml(配置文件),编译后无法加载B包创建的widget,报错为: 解决办法: 1.在工程的根目录下找到.actionScript ...
- iOS项目立项
哎,计划总是赶不上变化,仿佛又回到了十年前高三的时候,每月.每周.每天都有计划,但是每周.每天都有计划外的因素导致了计划时时变,唯一不变的就只有变化了. 想了许久,中期计划内还是转回iOS吧,说转回其 ...
- 高性能优化Web前端
高性能HTML 一.避免使用iframe iframe也叫内联frame,可将一个HTML文档嵌入另一个HTML文档中. iframe的好处是,嵌入的文档独立于父文档,通常也借此使浏览器模拟多线程.缺 ...
- c2ph
http://bolenot.ru/library/cmd/blcmdl1_c2ph.htm?-c2ph---Linux%E5%91%BD%E4%BB%A4--UNIX%E5%91%BD%E4%BB% ...
- Java帮助文档的生成
首先需要对代码加上文档的注释,比如下面这样: package wz.learning; /** * Title:Person<br> * Description: ...
- Android permission 访问权限大全
程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES ...
- 从逆向的角度去理解C++虚函数表
很久没有写过文章了,自己一直是做C/C++开发的,我一直认为,作为一个C/C++程序员,如果能够好好学一下汇编和逆向分析,那么对于我们去理解C/C++将会有很大的帮助,因为程序中所有的奥秘都藏在汇编中 ...
- Apache配置多个网站的方法
Apache的虚拟主机是一种允许在同一台机器上,运行超过一个网站的解决方案.虚拟主机有两种,一种叫基于IP的(IP-based),另一种叫基于名字的(name-based).虚拟主机的存在,对用户来说 ...