当前位置: 首页 > news >正文

【python】模块和包相关知识

程序导入其它模块和库,其实就是直接运行了对应的模块程序,或者对应的模块下的__init__.py文件。
在项目文件下创建两个python文件

基本模块知识

  1. model_test.py
print("model test begin....")

def modelTest():
    print("this is model test")


# 模块运行有两种方式
# 1.直接运行 --  __main__
# 2.导入运行 --  模块的绝对路径

print(f"__name__ is {__name__}")
# __name__可以区分是直接运行还是导入运行
# 如果是直接运行那么它会输出  __name__ is __main__
# 如果是导入运行那么它会输出  __name__ is model_test


# 所以在库模块中要测试模块功能,可以使用下面这种方式测试,而不会影响到导入此模块的程序
if __name__ == "__main__":
    modelTest()
    print("model test 直接运行")

直接运行model_test.py,它会输出 __name__ is __main__
在这里插入图片描述

  1. import_code.py
import model_test
from model_test import modelTest
# 模块运行有两种方式
#1.直接运行  __main__
#2.导入运行   模块的绝对路径

model_test.modelTest()
modelTest()

运行import_code.py,导入运行了model_test,它会输出 __name__ is model_test
if __name__ == "__main__":语句块下的命令,不会被导入运行!所以print("model test 直接运行")没有执行!而其他print都被执行了。
在这里插入图片描述

创建Python Package目录

在pycharm中创建python package目录,它会默认创建一个__init__.py文件而对应的目录会被标记为一个python package目录,或者我们手动创建一个普通目录,再手动创建__init__.py文件也是同样的效果。
我们创建如下目录结构:
在这里插入图片描述
__init__.py文件写入

# 包的初始化文件
# 导入包的时候会先执行这个文件
print("this is __init__.py")

a.py文件写入

print("this is a.py")

01模块和包.py中写入

from pythonpack import a

运行结果
首先执行了__init__.py里面的代码,其次才执行了a.py
在这里插入图片描述

创建一个flask程序测试模块效果

创建如下项目格式
在这里插入图片描述
app.py文件写入如下内容

from flask import Flask
def create_app():
    app = Flask(__name__)
    # 做app的配置
    return app

config/setings.py文件写入如下内容

Host="0.0.0.0"
Port=9000

main.py文件写入如下内容

from app import create_app
from config import setings
# 直接调用create_app()初始化app
app = create_app()

@app.route("/")
def index():
    return "this is index"

@app.route("/teacher")
def teacher():
    return "this is teacher"

@app.route("/student")
def student():
    return "this is student"

#使用setings.py中的配置
app.run(host=setings.Host, port=setings.Port, debug=True)

用这种导入调用的方式,将对应的配置放到对应的模块下,更加有利于项目的管理。

相对导入和绝对导入

在我们进行相对和绝对导入的时候需要,时刻关注top-level的位置 --》 程序入口,目录结构如下:
在这里插入图片描述

pack1.pack1model

# 这种方式导入叫做绝对导入
# from pythonpack.pack2 import pack2model


# 相对导入
from ..pack2 import pack2model

# 相对导入,不能访问到top-level那一层,只能访问到top-level以下层,下面这种会报错
#from ...pythonpack.pack2 import pack2model


def pack1test():
    print("this is pack1test")

pack2model.pack2test()

pack2.pack2model

def pack2test():
    print("this is pack2test")

程序入口.py

# 可以导入到函数,也可以导入到模块
#from pythonpack.pack1.pack1model import pack1test
#pack1test()

from pythonpack.pack1 import pack1model

# 绝对导入 相对导入
# 时刻关注top-level的位置 --》 程序入口
pack1model.pack1test()

在这里插入图片描述

top-level -> sys.path

那么既然只能导入top-level下的模块,那么python中的那么多模块,都是怎么找到的呢?
其实可以使用sys.path查看当前所有的top-level目录,而其中就包含当前的目录,而且返回一个list格式,我们可以自己定义一些路径加入到top-level中!使用sys.path.append(),这样一来就可以直接导入其它目录下的模块了!

import sys
print(sys.path)  #返回一个列表格式
sys.path.append("绝对路径")  #将其它路径也加入到top-level

模块的查找

1.先看内存里,是否导入过,如果导入过,就不会去找了,直接从内存拷贝。
2.如果内存里面没有,就去sys.path定义的路径顺序,一个一个去查找。

相关文章:

  • cpu 多级缓存L1、L2、L3 与主存关系
  • Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查
  • 渗透测试之利用sql拿shell(附完整流程+防御方案)【下】
  • 本地搭建DeepSeek R1模型 + 前端
  • docker compose 以redis为例
  • 【2025前端高频面试题——系列一之MVC和MVVM】
  • vue3组合式API怎么获取全局变量globalProperties
  • 机器学习:愚者未完成的诗篇(零)
  • c#面试题整理8
  • (更新完)LPZero: Language Model Zero-cost Proxy Search from Zero
  • 多Agent博弈的场景:博弈是策略选择和均衡问题
  • Docker参数,以及仓库搭建
  • [动手学习深度学习]12.权重衰退
  • 忘记dedecms后台超级管理员账号和密码的解决方案
  • MySQL表中数据基本操作
  • 【语料数据爬虫】Python爬虫|批量采集工作报告数据(1)
  • DeepSeek之后,Manus如何让AI长出「行动大脑」?(附邀请码等资料)
  • 【保姆级 HAL 库学习定时器】
  • AI大模型大规模应用下的又一次技术革命
  • Android设备是如何进入休眠的呢?
  • 上市公司重大资产重组新规九要点:引入私募“反向挂钩”,压缩审核流程
  • 秦洪看盘|风格有所转变,热钱回流高弹性品种
  • 征稿启事|澎湃·镜相第三届非虚构写作大赛暨2026第六届七猫现实题材征文大赛
  • 李成钢:近期个别经济体实施所谓“对等关税”,严重违反世贸组织规则
  • 中国恒大披露清盘进展:要求债权人提交债权证明表
  • 音乐节困于流量