python中的模块及包及软件目录结构规范
知识内容:
1.模块的定义与分类
2.模块的导入
3.模块与包
4.不同目录下的模块调用
一、模块的定义与分类
1.什么是模块
模块就是实现了某个功能的代码集合,模块是由一大堆代码构成的
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;re是处理正则表达式相关的模块
2.模块的分类
模块可以分为三种:
- 自定义模块
- 内置标准模块(又称标准库)
- 开源模块
自定义模块 和开源模块的使用参考 http://www.cnblogs.com/wupeiqi/articles/4963027.html
二、模块的导入
1.3种导入模块的方式:
- import 模块名 使用这种方式导入模块后如要使用模块中的对象可以使用以下方法: 模块名(别名).对象名
- from 模块名 import 对象名
- 导入一个模块中的所有对象: from 模块名 import *
注: 不推荐使用最后一种
2.为模块或对象起别名
- import 模块名 as 别名
- from 模块名 import 对象名 as 别名
1 import numpy as np 2 import pandas as pd 3 from bs4 import BeautifulSoup as Bf
3.在一行导入多个模块
1 import re, numpy, pandas
4.导入模块的顺序
(1) 导入python标准库中的模块(python环境自带模块),比如说os\sys\re\math
(2) 导入第三方库模块,比如说numpy\scrapy
(3) 导入自己定义或者开发的本地模块
示例:
1 # __author__ = "wyb"
2 # date: 2018/3/9
3
4 import os # 导入python自带模块os
5 import sys # 导入python自带模块sys
6 import requests # 导入python第3方模块requests
7 # import package # 导入自己写的模块package
8
9 from bs4 import BeautifulSoup # 从bs4包中导入BeautifulSoup模块
10 from math import sqrt # 从math模块中导入sqrt函数
5.模块搜索路径
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
官网解释:https://docs.python.org/3/tutorial/modules.html#the-module-search-path
搜索路径:
当一个命名为spam的模块被导入时 解释器首先会从内建模块中寻找该名字 找不到,则去sys.path中找该名字 sys.path从以下位置初始化
1 执行文件所在的当前目录
2 PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
3 依赖安装时默认指定的
强调:自定义的模块名千万不要跟python标准库的模块名重复,否则后果很严重
三、模块与包
1.使用模块的好处
- 大大提高代码的可维护性
- 提高代码复用性
注:
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
2.什么是包
你也许还想到,如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package),如下所示:
一个文件夹中管理多个模块文件,这个文件夹就称为包,包里也可以含有文件夹
注: 每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。
__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块。
自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys
模块,自己的模块就不可命名为sys.py
,否则将无法导入系统自带的sys
模块
3.导入包中的模块
导入包的本质: 执行__init__.py
所以导入包中的模块不能直接使用import package_name再使用package_name.module_name.function_name(),这样做会报错
真正的做法应该是from package_name import module_name 然后module_name.function_name(),这样做才是对的
四、不同目录下的模块调用
1.问题需求
项目目录下的bin目录里面的atm.py是程序的启动入口,由此启动项目,而core目录里的main.py是程序的主入口,那么如何能实现让atm.py能调用main.py运行程序呢?
2.解决问题
(1)在main.py()中写入:
1 # 项目程序的主入口,不在此写主要逻辑,只是在这里调用项目其他模块 2 3 def login(): 4 print("welcome to my atm")
(2)在atm.py中获取整个软件目录的跟目录:
1 import os 2 import sys 3 4 # 获取该项目整个外层的路径: D:\wyb\python\oldboy\2.进阶(函数,内置方法,模块,文件操作、字符编码)\软件目录结构规范\ATM 5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 6 print(BASE_DIR) 7 8 sys.path.append(BASE_DIR) #添加环境变量 9 10 from core import main 11 12 main.login() # 输出welcome to my atm