模块的概念

概念:一个.py文件就是一个模块,文件中存储着相似的多种功能。

种类:Python标志库、第三方模块、应用程序自定义模块。

模块的导入方式:

import 语句:

import [module1],[modeule1]...

eg:

自定义 .py 文件 cal.py ,内容写入如下代码:

1
2
3
4
5
def add(x,y):
return (x+y)
def sub(x,y):
return (x-y)
x=3

新建一个 .py 文件,使用 import 导入模块 cal:

1
2
3
4
import cal
print(cal.add(1,2)) #3
print(cal.sub(2,1)) #1
print(cal.x) #3

import 导入模块过程:

1.模块路径的搜索:

1
2
3
4
5
6
7
import sys
python(sys.path)
#['D:\\pycharm\\wook\\week1',
'D:\\pycharm\\wook',
'D:\\pycharm\\PyCharm 2019.2.1\\helpers\\pycharm_display', 'D:\\Envirement\\Python3\\Python37\\python37.zip', 'D:\\Envirement\\Python3\\Python37\\DLLs', 'D:\\Envirement\\Python3\\Python37\\lib',
'D:\\Envirement\\Python3\\Python37', 'D:\\Envirement\\Python3\\Python37\\lib\\site-packages',
'D:\\pycharm\\PyCharm 2019.2.1\\helpers\\pycharm_matplotlib_backend']

2.从第一个路径下开始寻找相关模块。

3.解释器解释模块内所有代码

from 从模块中调用方法

只加载指定调用的模块。

eg:

从 cal.py 中调用 add 方法:

1
2
3
4
5
6
7
from cal import add 
print(add(1,2)) #3
print(cal.add(2,1)) #name 'cal' is not defined

from cal import * #加载所有变量
print(add(1,2)) #3
print(x) #3

当调用的模块中方法名和同文件中的函数名重复时执行相对位置较后的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f():
print('ok1')
def f():
print('ok2')
f() #ok2
*******************************
from cal import *
def add(x,y):
print(x+y+2)
add(1,2) #5
*******************************
def add(x,y):
print(x+y+2)
from cal import *
add(1,2) #3

模块中方法调用时取别名:

1
2
from cal import add as a
print(a.(1,2)) #3

包的概念

为了避免模块名冲突,python 又引入了按目录来组织模块的方法,称为包,包是用来组织模块的文件夹。每个包下包含一个 _init_ .py 文件。

包的调用:

eg:

web 包下 py 文件内容分别为:

1
2
3
#logger.py
def logger():
print('logging')

调用 web 包中的 log 模块

1
2
3
4
5
6
7
8
from web import log #一层调用
log.logger() #logging

from web.web1 import log #二层调用
log.logger() #logging

from web.web1.log import log #二层调用模块中的方法
logger() #logging

调用包的过程:

import [package] 只执行 _init_.py 文件。

1
2
3
4
5
import web 
print(web.main.x) #module 'web' has no attribute 'main'

from web import main
print(main.x) #3

目录结构

新建项目如下:

各文件中代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#logger.py
def log_function():
print(logging)

#main.py
import logger
def main():
logger.log_function()

#bin.py
from mudule import main
main.main()

在 pycharm 中执行结果:

在命令行的执行结果:

这种调用,在 python 解释器中可执行成功,但是在命令行下不能执行成功,报错内容为没有模块名字为 mudule 。

为什么在 pycharm 中没有报错呢?

原因在于 python 解释器在第一层路径 D:/pycharm/ATM/bin/bin.py 中找不到 mudule后, 自动搜索路径父级路径 D:/pycharm/ATM/bin ,该路径中仍然找不到,于是继续寻找父路径 D:/pycharm/ATM,该路径中存在 mudule ,于是执行成功。

而在命令行下却因为第一层找不到该模块而报错。

解决方法如下:

1
2
3
4
import os
import sys
WAY=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #D:\pycharm\ATM
sys.path.append(WAY) #自动添加搜索路径

__name__变量

在同级目录下新建 name.py 和 function.py 观察如下代码的执行效果:

1
2
3
4
5
6
7
#name.py
def foo()
print('foo...')
print(__name__) #__main__

#function.py
import function #function

__name__ 变量返回值具有如下规则:

在一个文件中执行时,__name__ 返回 __main__ ,当在调用处的文件中执行时,__name__ 返回该文件的名字。