10.1.1
要告诉解释器去哪里查找这个模块,可执行如下命令(以Windows目录为例):
>>> import sys
>>> sys.path.append('C:/python')
如果一定要重新加载模块,可使用模块importlib中的函数reload,它接受一个参数(要重新加载的模块),并返回重新加载的模块。如果在程序运行时修改了模块,并希望这种修改反映到程序中,这将很有用。
10.1.3 让模块可用
Python打包技术一度日益复杂、各自为政,尽管现已被Python Packaging Authority控制并简化,但需要学习的还是有很多。这里不深入介绍这个棘手的主题,建议参阅“Python打包用户指南”:packaging.python.org。
- 将模块放在正确的位置
将模块放在正确的位置很容易,只需找出Python解释器到哪里去查找模块,再将文件放在这个地方即可。
# 你可能还记得,可在模块sys的变量path中找到目录列表(即搜索路径)。
>>> import sys, pprint
>>> pprint.pprint(sys.path)
['C:\\Python35\\Lib\\idlelib',
'C:\\Python35',
'C:\\Python35\\DLLs',
'C:\\Python35\\lib',
'C:\\Python35\\lib\\plat-win',
'C:\\Python35\\lib\\lib-tk',
'C:\\Python35\\lib\\site-packages']
提示 如果要打印的数据结构太大,一行容纳不下,可使用模块pprint中的函数pprint(而不是普通print语句)。pprint是个卓越的打印函数,能够更妥善地打印输出。
虽然放在这里显示的任何一个位置中都可行,但目录site-packages是最佳的选择,因为它就是用来放置模块的。
2. 告诉解释器到哪里去查找
如果将模块放在其他地方,就必须告诉解释器到哪里去查找。前面说过,要告诉解释器到哪里去查找模块,办法之一是直接修改sys.path,但这种做法不常见。标准做法是将模块所在的目录包含在环境变量PYTHONPATH中。
环境变量PYTHONPATH的内容随操作系统而异(参见旁注“环境变量”),但它基本上类似于sys.path,也是一个目录列表。
10.1.4 包
为组织模块,可将其编组为包(package)。包其实就是另一种模块,但有趣的是它们可包含其他模块。模块存储在扩展名为.py的文件中,而包则是一个目录。要被Python视为包,目录必须包含文件__init__.py。如果像普通模块一样导入包,文件__init__.py的内容就将是包的内容。
表10-1 一种简单的包布局
文件/目录 | 描 述 |
---|---|
~/python/ | PYTHONPATH中的目录 |
~/python/drawing/ | 包目录(包drawing) |
~/python/drawing/init.py | 包代码(模块drawing) |
~/python/drawing/colors.py | 模块colors |
~/python/drawing/shapes.py | 模块shapes |
完成这些准备工作后,下面的语句都是合法的:
import drawing # (1) 导入drawing包
import drawing.colors # (2) 导入drawing包中的模块colors
from drawing import shapes # (3) 导入模块shapes
执行第1条语句后,便可使用目录drawing中文件__init__.py的内容,但不能使用模块shapes和colors的内容。执行第2条语句后,便可使用模块colors,但只能通过全限定名drawing.colors来使用。执行第3条语句后,便可使用简化名(即shapes)来使用模块shapes。请注意,这些语句只是示例,并不用像这里做的那样,先导入包再导入其中的模块。换而言之,完全可以只使用第2条语句,第3条语句亦如此。