模块的几个作用:
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)
这个文件相当于定义了一个模块的两个子功能,可以单独进行调用。