模块与包之间的调用

Posted sunny7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块与包之间的调用相关的知识,希望对你有一定的参考价值。

一. 模块

定义: 如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。

模块可以分为自定义模块、内置模块和第三方模块

1.内置模块

2.第三方模块

3.自定义模块

什么叫自定义模块? 自定义模块就是你自己编写的模块 ,在Python中,其后缀名是.py 就是一个模块

  • 例如: 在Pycharm里建个py文件module,写入代码:

    def say_hi():    
    print(‘name‘)     
    say_hi() #这样就创建了一个模块.可以添加多个函数,跟正常的python文件一样

二. 包: 用来从逻辑上组织模块。本质就是一个目录(必须带有一个int.py文件)

为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为(Package),包名通常为全部小写,避免使用下划线.包是模块的集合,比模块又高一级的封装。没有比包更高级别的封装,但是包可以嵌套包,就像文件目录一样.
技术分享图片

最顶层的Django包封装了contrib子包,contrib包又封装了auth等子包,auth又有自己的子包和一系列模块。通过包的层层嵌套,我们能够划分出一个又一个的命名空间。

三. 模块与包之间的互相导入

   在我们的程序中,使用其它的模块(包、类、函数),就必须先导入对应的模块(包、类、函数)。在Python中,模块(包、类、函数)的导入方式有:

1.在绝对路径下,导入自定义的模块.绝对路径指在一个包文件下的.py互相导入

路径说明:core为包文件,Module_a,Main.py为core的俩个py文件

方式一 :import  模块名

比如,被导入的模块Module_a:

# Module_a.py
def func():
    print("this is module A!") 

在Main.py中导入Module_a:

# Main.py
import module_a   #import  模块名
module_a.func()  # 调用方法  模块名.函数名() #注意中间有个点 

方式二:from 模块名  import 函数名

在Main.py中导入Module_a:

# Main.py
from module_a import func
module_a.func()   # 错误的调用方式
func()  # 这时需要直接调用func

方式三: form 模块名 import * 将对象内的所有内容全部导入

A.在Main.py中导入Module_a: 导入单个函数

from module_a import *
func()  
返回:this is module A!

B.如果针对导入的模块内有多个函数.需要导入并使用:

#module_a.py
def func():
    print("this is module A!")

def fun123():
    print(‘this is fun123

在Main.py中导入Module_a: 导入多个函数

from module_a import *
func()
fun123()
返回:
this is module A!
this is fun123

C:需要注意的是:在main.py模块内定义的函数名与module_a的名称一样,就会被覆盖,尽量做到不与函数名重复.

# Main.py
from module_a import *
def func():
    print("this is main module!")

func()  # 从module导入的func被main的func覆盖了

2.在相对路径下导入包,包与包之间的相互调用:
技术分享图片

路径说明:在图中 modile11, bin, core 都是包,并且bin和core是modile11的子包 .

在这种相对路径下导入,子包与子包的相互调用,需要用到os,sys模块将路径添加到环境变量里.

以图为例子:在子包bin文件下的`run.py`文件要导入core子包的`module_a.py`文件信息. 就要先找到`bin`,`core`的共同父级目录
添加到环境变量
import os
import sys
DIR =os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(DIR)
sys.path.append(DIR)

比如,被导入的模块Module_a:

# Module_a.py

def func():
    print("this is module A!") 
#def fun123():
   # print(‘this is fun123‘)

方式一: from 包名 import 模块名

from core  import module_a
module_a.func()  #调用方法  模块名.函数名()
module_a.fun123()  #针对module_a模块内有多个函数也可这样使用
返回:
this is module A!

方式二: from 包名. 模块名 import *

from core.module_a  import *
func()         #调用方法  函数名()
#fun123()       #针对module_a模块内有多个函数也可这样使用
返回:
this is module A!

需要注意的是:

在包与包之间的导入,在实际应用中用的比较多,如果被导入的模块函数比较多,也可这样使用.

四:模块搜索路径

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

Python根据sys.path的设置,按顺序搜索模块。

当然,这个设置是可以修改的,就像windows系统环境变量中的path一样,可以自定义。 通过sys.path.append(‘路径‘)的方法为sys.path路径列表添加你想要的路径。 如 图中,添加到环境变量的例子.





以上是关于模块与包之间的调用的主要内容,如果未能解决你的问题,请参考以下文章

python之基础篇——模块与包

python模块与包的调用

模块与包

调用模块与包

Lua 模块与包 调用c程序.so文件

Day 28(06/28)模块与包的调用