【循序渐进学Python】10.模块和包

简介:

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.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__ 变量我们可以很容易的实现这点:

复制代码
 1 # -- coding: utf-8 --
 2 
 3 def hello():
 4     print "hello,world!"
 5 
 6 def test():
 7     hello()
 8 # 如果作为程序运行,Hello函数会被执行,
 9 # 作为模块时不执行,因为这时:__name__ = hello
10 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 # output
11 # api_version
12 # argv
13 # ...
复制代码

 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/

 

参考资料&进一步阅读

Python基础教程(第二版)

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/

                                        

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/p/Python_module_package.html ,如需转载请自行联系原作者
相关文章
|
1月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
47 4
|
10天前
|
Python
Python Internet 模块
Python Internet 模块。
105 74
|
28天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
105 63
|
1月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
1月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
22天前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
28 5
|
1月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
40 5
|
1月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
37 0
|
1月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
25 0