在一个模块被导入时,PVM会在后台从一系列路径中搜索该模块,其搜索过程如下:
1、在当前目录下搜索该模块;
2、在环境变量PYTHONPATH中指定的路径列表中依次搜索;
3、在python安装路径中搜索
事实上,python虚拟机通过变量sys.path中包含的路径来搜索,这个变量里面包含的路径列表就是上面提到的这些路径信息:
>>> import sys
>>> print sys.path
['D:/Python27/my', 'D:\\Python27\\Lib\\idlelib', 'C:\\Windows\\system32\\python27.zip', 'D:\\Python27\\DLLs', 'D:\\Python27\\lib', 'D:\\Python27\\lib\\plat-win', 'D:\\Python27\\lib\\lib-tk', 'D:\\Python27', 'D:\\Python27\\lib\\site-packages', 'D:\\Python27\\machineLearning']
不同的机器上显示的路径信息可能不一样,但至少都包含上面提到的3点。知道了这个路径搜索规律后,我们就可以很方便的将某些
目录动态的增加到搜索路径中去,比如在E盘下建立一个python模块module.py,内容如下:
print("Hello world") print 2 ** 2然后在交互模式下执行导入:
>>> import module Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named module
>>> sys.path.append("E:\\") >>> print(sys.path) ['', 'C:\\Windows\\system32\\python27.zip', 'D:\\tools\\Python27\\DLLs', 'D:\\tools\\Python27\\lib', 'D:\\tools\\Python27\\lib\\plat-win', 'D:\\tools\\Python27\\lib\\lib-tk', 'D:\\tools\\Python27', 'D:\\tools\\Python27\\lib\\site-packages', 'D:\\tools\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode', 'E:\\']>>> import module_4Hello world4
首先是在sys.path中增加了E盘根目录作为搜索路径,随后的打印中可以看到确实已经被添加到sys.path中去了,然后再执行导入就会正常导入模块并执行模块中的语句了。当然,我们通过交互模式新增加的搜索路径也仅仅是在当前交互模式下有效,一旦退出了那么就就失效了。因此,我们可以根据搜索路径规则的第2步中说的来设置PYTHONPATH环境变量就可以满足不同使用情况下都可以找到模块了。
模块包在文件系统中的表示就是一系列目录的集合,通过目录的层级结构形成模块包的层级结构,最终的模块文件就位于最后的目
录中。比如定义一个简单的模块在包pkg下,那么执行如下步骤:
1、在D:\temp目录下建立一个目录,名称是pkg
2、在pkg下建立一个__init__.py的模块,内容为空即可
3、在pkg目录下建立一个python模块module.py,内容如下:
# -*- encoding:utf-8 -*- '''pkg.module.py模块的内容''' print 'This is module' def func(): print 'This is a function!!'注意第2步,必须要在每一个包目录下建立一个__init__.py的模块,这个是python的规定,用来告诉python解释器将该目录当成一个
内容包,即该目录是一个包,里面包含了python模块的。这个是必须的,如果不指定,则我们在python的交互模式下导入module.py
这个模块时会报如下错误:
>>> import pkg.module Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named pkg.module_3因此包目录下的__init__.py模块是必须的,但内容是可选的,可以为空内容,也可以写一些代码或作其他用途。PVM在导入某个包
下的模块时会先导入这个包下的__init__.py模块,比如我们将__init__.py模块的内容指定如下:
print("This is __init__ module")
>>> import pkg.module This is __init__ module This is module >>>