模块(module)的概念:
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越來越长,越來越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种代码的方式。在Python中,一个.py文件称之为一个模块(Module)。
模块一共三种:
python标准库
第三方模块
应用程序自定义模块
模块是用来组织函数的
在pycharom创建module_projet目录
在module_projet目录中创建calculate.py文件
calculate.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/1/31 下午9:51
def add(x,y):
return x + y
def sub(x,y):
return x - y
在module_projet再创建bin.py文件
bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import calculate #解释器通过搜索路径找到calculate.py后,将calculate.py都给calculate; print(calculate.add(1,2))
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py 3 Process finished with exit code 0
搜索路径:sys.path
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import sys print(sys.path) /home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ['/home/smoke/PycharmProjects/pythonProject/lean_python/module_project', '/home/smoke/PycharmProjects/pythonProject', '/opt/pycharm/pycharm-2020.2.3/plugins/python/helpers/pycharm_display', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/smoke/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages', '/opt/pycharm/pycharm-2020.2.3/plugins/python/helpers/pycharm_matplotlib_backend'] Process finished with exit code 0
修改calculate.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/1/31 下午9:51
print('ok')
def add(x,y):
return x + y
def sub(x,y):
return x - y
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import sys import calculate
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok Process finished with exit code 0
修改calculate.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/1/31 下午9:51
print('ok')
x = 3
def add(x,y):
return x + y
def sub(x,y):
return x - y
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import sys import calculate print(x) print(calculate.x)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
ok
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 8, in <module>
print(x)
NameError: name 'x' is not defined
Process finished with exit code 1
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import sys import calculate print(calculate.x)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 3 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add #从模块里调用方法,只加载方法; print(add(1,4))
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 5 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add,sub print(add(1,4)) print(sub(3,6))
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 5 -3 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add,sub print(add(1,4)) print(sub(3,6)) print(x)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 10, in <module>
print(x)
NameError: name 'x' is not defined
ok
5
-3
Process finished with exit code 1
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add,sub print(add(1,4)) print(sub(3,6)) print(callable.x)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
ok
5
-3
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 10, in <module>
print(callable.x)
AttributeError: 'builtin_function_or_method' object has no attribute 'x'
Process finished with exit code 1
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import calculate,time #倒入calculate和time模块 from calculate import add,sub print(add(1,4)) print(sub(3,6)) print(calculate.x) time.sleep(1)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 5 -3 3
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import * #导入所有变量方法都导进来 print(add(1,2))
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 3 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import * print(add(1,2)) print(sub(1,2)) print(x)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 3 -1 3 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/1/31 下午9:55
from calculate import *
def add(x,y): #又写一次add函数,调用下面的add函数
return x + y + 2
print(add(1,2))
print(sub(1,2))
print(x)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 5 -1 3 Process finished with exit code 0
在module_projet再创建test.py文件
test.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午9:28
def f():
print('ok1')
def f():
print('ok2')
f()
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/test.py
ok2
Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/1/31 下午9:55
def add(x,y):
return x + y + 2
from calculate import *
print(add(1,2))
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 3 Process finished with exit code 0
修改calculate.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/1/31 下午9:51
print('ok')
print('ok2')
x = 3
def add(x,y):
return x + y
def sub(x,y):
return x - y
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import *
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok ok2 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import * from calculate import * #再导入一次不会解释
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok ok2 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok ok2 Process finished with exit code 0
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add print(sub(1,2))
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
ok
ok2
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 7, in <module>
print(sub(1,2))
NameError: name 'sub' is not defined
Process finished with exit code 1
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from calculate import add as plus #导入calculate模块的add方法并命名为plus plus(1,2)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok ok2 Process finished with exit code 0
包(package)
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package);
在module_projet目录中创建名为web的Python Package,会自动创建__init__.py文件,来区分包和文件夹,包使用来组织模块的;
在module_projet目录中名为web的Python Package创建main.py、logger.py文件
logger.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午9:55
def logger():
print('logging')
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import web.logger logger.logger()
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 7, in <module>
logger.logger()
NameError: name 'logger' is not defined
Process finished with exit code 1
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from web import logger logger.logger()
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py logging Process finished with exit code 0
在module_projet目录中名为web的Python Package创建web2的Python Package
将logger.py移动到web2的Python Package
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from web.web2 import logger logger.logger()
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py logging Process finished with exit code 0
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from web.web2 import logger.logger logger()
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 5
from web.web2 import logger.logger
^
SyntaxError: invalid syntax
Process finished with exit code 1
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from web.web2.logger logger.logger()
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 5
from web.web2.logger
^
SyntaxError: invalid syntax
Process finished with exit code 1
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from web.web2.logger import logger #正确logger(),调用包、包、模块下的方法 logger()
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py logging Process finished with exit code 0
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import web #执行了__init__文件
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py Process finished with exit code 0
修改module_projet目录中名为web的Python Package的__init__.py文件
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:05
print('ok')
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok Process finished with exit code 0
修改module_projet目录中名为web的Python Package的main.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午9:55 x=4
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import web #执行了__init__文件 print(web.main.x)
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py
ok
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py", line 7, in <module>
print(web.main.x)
AttributeError: module 'web' has no attribute 'main'
Process finished with exit code 1
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 import calculate print(calculate.x)
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok ok2 3 Process finished with exit code 0
import模块和import包的区别:import模块本质是把内部所有内容加载一遍,import包是执行了__init__.py文件,__init__.py文件有一个print('ok'),它与web下面的main.py没关系;
修改bin.py文件
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/1/31 下午9:55 from web import main print(main.x)
执行bin.py文件
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/pythonProject/lean_python/module_project/bin.py ok 4 Process finished with exit code 0
最终包、目录、模块结构

创建ATM项目
在ATM项目里面创建bin包,在bin包里面创建bin.py模块,这个脚本就是程序的整个入口;
在ATM项目里面创建module包,所有与逻辑相关的代码都放在module包里面,比如在module包里面创建main.py、logger.py
在ATM项目里面创建conf包,在bin包里面创建settings.py,所有与配置相关都放在这个包里面
最终项目目录

修改module包里的logger.py文件
logger.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:48
def logging():
print('logging')
修改module包里的main.py
main.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:47
import logger
def main():
logger.logging()
main()
执行main.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/module/main.py logging Process finished with exit code 0
让bin.py成为程序入口
修改module包里的main.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:47
import logger
def main():
logger.logging()
修改bin包了里面的bin.py
bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 main()
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/bin/bin.py
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/ATM/bin/bin.py", line 5, in <module>
main()
NameError: name 'main' is not defined
Process finished with exit code 1
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 from module import main main.main()
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/bin/bin.py
Traceback (most recent call last):
File "/home/smoke/PycharmProjects/ATM/bin/bin.py", line 5, in <module>
from module import main
File "/home/smoke/PycharmProjects/ATM/module/main.py", line 5, in <module>
import logger
ModuleNotFoundError: No module named 'logger'
Process finished with exit code 1
修改main.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:47
from module import logger
def main():
logger.logging()
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/bin/bin.py logging Process finished with exit code 0
虽然执行成功,但是是隐藏错误,是因为pycharm做了一件事情,pycham添加了/home/smoke/PycharmProjects/ATM路径;
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 from module import main main.main() import sys print(sys.path) /home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/bin/bin.py logging ['/home/smoke/PycharmProjects/ATM/bin', '/home/smoke/PycharmProjects/ATM', '/opt/pycharm/pycharm-2020.2.3/plugins/python/helpers/pycharm_display', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib -dynload', '/home/smoke/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages', '/opt/pycharm/pycharm-2020.2.3/plugins/python/helpers/pycharm_matplotlib_backend'] Process finished with exit code 0
在命令行执行bin.py程序
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py
Traceback (most recent call last):
File "bin.py", line 5, in <module>
from module import main
ModuleNotFoundError: No module named 'module'
修改bin.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:57
import sys
sys.path.append('/home/smoke/PycharmProjects/ATM') #添加path路径
from module import main
main.main()
在命令行执行bin.py程序
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py logging
但是这样把路径写死了,放到别的目录又不能运行了;
使用BASEDIR变量
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 print(__file__)
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/bin/bin.py /home/smoke/PycharmProjects/ATM/bin/bin.py Process finished with exit code 0
在命令行执行bin.py
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py bin.py
在pycharm和命令行执行结果不一样,因为pycharm将相对路径转换为绝对路径
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 import os print(os.path.abspath(__file__)) #把相对路径变为绝对路径
在命令行执行bin.py
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py /home/smoke/PycharmProjects/ATM/bin/bin.py
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 import os print(os.path.abspath(__file__)) #把相对路径变为绝对路径 print(os.path.dirname(os.path.abspath(__file__)))
在命令行执行bin.py
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py /home/smoke/PycharmProjects/ATM/bin/bin.py /home/smoke/PycharmProjects/ATM/bin
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 import os print(os.path.abspath(__file__)) #把相对路径变为绝对路径 print(os.path.dirname(os.path.abspath(__file__))) print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
在命令行执行bin.py
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py /home/smoke/PycharmProjects/ATM/bin/bin.py /home/smoke/PycharmProjects/ATM/bin /home/smoke/PycharmProjects/ATM
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 import os import sys BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from module import main main.main()
执行bin.py
/home/smoke/PycharmProjects/pythonProject/venv/bin/python /home/smoke/PycharmProjects/ATM/bin/bin.py logging Process finished with exit code 0
在命令行执行bin.py
smoke@smoke-GS70-2PC-Stealth:~/PycharmProjects/ATM/bin$ python3.8 bin.py logging
修改settings.py
#!/usr/bin/env python3.8
# __author: "smoke"
# date: 2021/2/1 下午10:49
shopping_product=[
(),
(),
(),
(),
(),
]
修改bin.py
#!/usr/bin/env python3.8 # __author: "smoke" # date: 2021/2/1 下午10:57 import os import sys BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from module import main from conf import settings main.main()
浙公网安备 33010602011771号