模块(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()