模块

 

模块的几个作用:

1. 提高代码的可维护性

2. 可重用

3. 避免函数名或者变量名的冲突

 

一个模块可以是一个py文件(功能比较单一简单),也可以是一个目录(称作package,),其下可能还有子目录等,表示模块功能比较多。单独加载里面的子目录时可以使用点号分割,比如from django.core import xxx

 

# 当前python已经包含的所有模块,包括了内建模块和你手动安装的第三方模块。一般带下划线的表示模块内部使用,不用怎么关心。这里输出的模块需要使用时都需要import

>>> help('modules')

查看当前已经加载的模块:

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> import os
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os']

 

导入模块的方式(模块的调用):    -- 模块一旦调用,相当于执行了对应的py文件

1. import <module name>  -- 导入整个模块

2. from os import rename rmdir    -- 导入OS模块的两个功能,这样可以直接使用rename.xxx而不用加上os.前缀了。一般在模块功能比较多,而实际使用其中很少的几个功能时这么使用。

3. from os import *    -- 同第二点,是导入os模块里所有的功能,都不用加上os.前缀了。但是不推荐这样用,你的整个程序里可能导入多个模块,各个导入的模块的函数名谁都无法保证不重名,还有自己写的函数。

4. from django.core import xxx     -- 大型模块,

5. from modules_name.xx.xx import xxx as aliasname:    给导入的模块起个别名

跨模块导入:

先获取脚本绝对路径,再使用相对路径

__file__:脚本执行时显示路径,比如python3 /root/pyproj/test.py,结果为/root/pyproj/test.py,而如果cd /root; python3 pyproj/test.py的结果则是pyproj/test.py。说白了就是你键入的路径

os.path.abspath() :真正的绝对路径,不管你在什么路径下执行以及键入什么路径,脚本所在文件系统路径是不会变的

os.path.dirname():文件或者目录的上一层目录,即父目录。

 

模块的路径

假设Python安装路径为:PYTHON_HOME=/usr/local/python3/

内部模块路径:$PYTHON_HOME/lib/python3.6/

那么第三方安装模块默认安装在$PYTHON_HOME/lib/python3.6/site-packages目录里,建议自定义模块也都放这里(当然,标准化后放到哪里都可以正常加载模块,这里只是一种规范)

 

加载模块的顺序

>>> import sys
>>> sys.path
['', '/usr/local/python3/lib/python36.zip', '/usr/local/python3/lib/python3.6', '/usr/local/python3/lib/python3.6/lib-dynload', '/root/.local/lib/python3.6/site-packages', '/usr/local/python3/lib/python3.6/site-packages']

这是Python默认加载列表,你也可以进行修改。假如当前工作目录不是自定义模块的同一级目录,那么直接加载该模块会提示找不到,那么此时可以将其目录添加到这个Python环境变量列表里:sys.path.append("/root/pystu/module2/practise")

 

加载顺序按照这个列表中的先后顺序进行加载。说明如下:

1. 第一个为空代表当前目录

2. '/usr/local/python3/lib/python3.6'   -- 是内建模块路径

3. 最后一个是第三方安装模块默认安装路径

其他几个路径不用太过关注

 

自定义模块

假设我在目录/root/pystu/module2/practise下创建了一个文件:module_test.py,内容如下:

# _*_ coding:utf-8 _*_
def m01(name):
print("m01:",name)

def m02(name):
print("m02:",name)

这个文件相当于定义了一个模块的两个子功能,可以单独进行调用。

 

 

posted @ 2018-07-09 16:07  念宗  阅读(107)  评论(0编辑  收藏  举报