模块简介
python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题。模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了系统默认的内置函数(模块)不需要导入外。
导入直接使用如下语法: import模块名称 (不要.py后缀)
这样导入成功后,就可以在另外一个模块中使用被导入模块的功能函数或对象。
模块一
# coding=utf-8
"""
上面第一行是指定编码格式,因为python默认是按照ascii编码来处理的,
因此就无法处理非英文语言,通过指定编码就可以实现国际化效果,即容许中文注释
"""
"""module_1.py"""
#注释信息
name = "django中文学习"
url = "https://docs.djangoproject.com/zh-hans/2.0/"
模块二
并导入模块一
# -*- coding=utf-8 -*-
from module_1 import name,url
print(name,"网址:",url)
"""from module_1 import url as myurl 将url的值赋给myurl变量,使用了from…import语句,
将变量绑定在顶层命名空间,告诉python解释器要加载指定的模块,并执行模块中的所有语句,因此如果模
块中有类似print的语句时,我们在导入的过程中也会看到这些语句的输出"""
print(__name__)
def sum(a,b):
return a+b
if __name__ == "__main__":
import sys
print(sys.argv[0])
a = int(sys.argv[1])
b = int(sys.argv[2])
print(sum(a,b))
"""
python解释器会将所有传递的参数存储在sys.argv这个列表中,所有的参数都被当成字符串进行处理。
同时即使不传递任何参数,也会有一个默认的参数sys.argv[0]标识当前模块的名称(如module_2.py)
所以我们自己使用的参数都是从sys.argv[1]开始的,下标1表示第一个传递的参数,依次类推。
"""
模块包和搜索路径
一个python文件就是一个模块,使用独立的命名空间,但实际使用过程中单单用模块来定义python功能显然还不够。因为一个大型的系统几千上万个模块是很正常的事情,如果都聚集在一起显然不好管理并且有命名冲突的可能,因此python中也出现了一个包的概念。包(package),通过使用“点模块名称”创建Python模块命名空间的一种方法。例如,模块名称 A.B 表示一个在名为 A的包下的名为B的子模块。就像使用模块让不同模块的作者无需担心彼此全局变量名称(冲突)一样,点模块名称让多模块包的作者无需担心彼此的模块名称(冲突)。模块包在文件系统中的表示就是一系列目录的集合,通过目录的层级结构形成模块包的层级结构,最终的模块文件就位于最后的目录中。比如定义一个简单的模块在包pkg下,那么执行如下步骤:
1、在合适的Python路径目录(比如 \lib\site-packages)下建立一个目录,名称是myModule
2、在myModule下建立包(子目录)com\homer,并在项目目录myModule\com\homer下com和com\homer下分别创建init.py的模块,内容为空即可
3、在myModule\com\homer目录下建立一个python模块module_3.py,内容如下:
# -*- encoding:utf-8 -*-
'''pkg.module_3.py模块的内容'''
print("Hello World")
def func1():
print("This is funciton one")
注意: 必须要在每一个包目录下建立一个__ init__.py的模块,这个是python的规定,否则导入module_3.py这个模块时会报错,用来告诉python解释器将该目录当成一个内容包,即该目录是一个包,里面包含了python模块的。
包目录下的__ init__.py模块是必须的,但内容是可选的,可以为空内容,也可以写一些代码或作其他用途。PVM(Python虚拟机)在导入某个包下的模块时会先导入这个包下的__ init__.py模块,比如我们在__ init__.py模块里添加内容:
print("This is __init__ module")
然后,在交互模式下重新导入这个包,则交互式输出效果如下:
>>> from com.homer import module_3
This is __init__ module
Hello World
>>>
可见,PVM首先加载的是__ init__.py模块,然后才是找该目录下的其他模块并进行加载。
python中的模块搜索路径
在一个模块被导入时,PVM会在后台从一系列路径中搜索该模块,其搜索过程如下:
1、在当前目录下搜索该模块;
2、在环境变量PYTHONPATH中指定的路径列表中依次搜索;
3、在python安装路径中搜索
事实上,PVM通过变量sys.path中包含的路径来搜索,这个变量里面包含的路径列表就是上面提到的这些路径信息,我们可以打印看下sys.pth都包含些哪些路径:
import sys
print(sys.path)
['', 'C:\\Windows\\system32\\python33.zip', 'F:\\Profiles\\Python33\\DLLs', 'F:\\Profiles\\Python33\\lib', 'F:\\Profiles\\Python33', 'F:\\Pro-files\\Python33\\lib\\site-packages']
动态的增加模块存放路径到搜索模块,再执行导入:
import sys
sys.path.append("F:\Pro-files\workspace\myPython") #这里是你指定的目录
print(sys.path)
['', 'C:\\Windows\\system32\\python33.zip', 'F:\\Profiles\\Python33\\DLLs', 'F:\\Profiles\\Python33\\lib', 'F:\\Profiles\\Python33', 'F:\\Pro-files\\Python33\\lib\\site-packages', 'F:\\Pro-files\\workspace\\myPython']
再进行引入
from com.homer import moduleX
我们通过交互模式新增加的搜索路径也仅仅是在当前交互模式下有效,一旦退出了那么就就失效了。因此,我们可以根据搜索路径规则的第2步中说的来设置PYTHONPATH环境变量就可以满足不同使用情况下都可以找到模块了。
网友评论