python的脚本、模块与包、目录的关系以及区别

news2024/12/15 13:49:07

        在Python中,脚本(Script)、模块(Module)、包(Package)和目录(Directory)是四个相关但概念不同的术语,它们在组织代码和管理项目时扮演着不同的角色。以下是它们的关系和区别。

1. 脚本(Script)

  • 定义:脚本是包含Python代码的单个文件(通常以.py结尾),可以直接运行。
  • 作用:实现特定功能或任务,通常是程序的入口点。
  • 特点
    • 可以在命令行中直接运行,例如:python script.py
    • 脚本通常包含主逻辑或命令行接口(CLI)。
示例:
# script.py
def main():
    print("Hello, World!")

if __name__ == "__main__":
    main()
  • 运行方式
    • 在终端中执行:python script.py

2. 模块(Module)

  • 定义:模块是一个包含Python代码的文件(通常也以.py结尾),用于封装相关的函数、类和变量。
  • 作用
    • 将代码分割为可重用的部分。
    • 提供命名空间,避免命名冲突。
  • 特点
    • 模块可以被其他模块或脚本导入和使用。
    • 每个模块是一个独立的文件。
示例:
# module1.py
def greet():
    return "Hello from module1!"
  • 使用方式
    import module1
    print(module1.greet())  # 输出: Hello from module1!
    

        可以将模块理解为特殊的脚本,它与脚本的区别就在于:脚本的目的是实现特定功能或任务,而模块主要是为了代码的封装和复用。模块的重点在于提供一些通用的功能,以便其他脚本或模块可以使用。例如,`math`模块提供了各种数学运算相关的函数,如`sin`、`cos`、`sqrt`等,这些函数可以被不同的程序(如科学计算程序、图形绘制程序等)反复使用,模块本身并不关心具体的应用场景是什么。


 3. 目录(Directory)

  • 定义:目录是操作系统中的一个文件夹,用于组织和存储文件和子目录。
  • 作用:用于管理文件的物理存储结构。
  • 特点
    • 不涉及编程逻辑,只是一个文件系统中的组织单元。
    • 在Python项目中,常用的目录结构包括srctestsdatadocs等。
示例:
my_project/
├── src/
│   ├── module1.py
│   ├── module2.py
├── tests/
│   ├── test_module1.py
│   ├── test_module2.py
├── data/
│   ├── input.csv


 4. 包(Package)

  • 定义:包是一个包含__init__.py文件的目录,用于组织模块,便于代码的重用和模块化。(在Python 3.3 及以后,可以通过在目录中放置 __init__.py 文件或使用 pyproject.toml 文件来声明包。尽管不再强制要求 __init__.py,但为了兼容性和明确性,通常仍建议包含它。)
  • 作用
    • 将相关的模块组织在一起,形成一个逻辑上的单元。
    • 提供命名空间,避免模块名冲突。
  • 特点
    • Python 3.3 之后,__init__.py文件不再是必须的,但仍然推荐使用。
    • 包可以包含子包、模块和其他资源文件。
示例:
my_package/
├── __init__.py  # 标识这是一个包
├── module1.py   # 模块
├── module2.py   # 模块
  • __init__.py的作用
    • 标识目录是一个包。
    • 可以包含包的初始化代码或导出模块的逻辑。
示例代码:
# module1.py
def greet():
    return "Hello from module1!"
# __init__.py
from .module1 import greet
  • 使用方式
    import my_package
    print(my_package.greet())  # 输出: Hello from module1!
    

 包可以理解为一个特殊的目录,目录中包含了一些组织到一起的模块。


5. 实际项目中的应用

项目的目录结构示例
my_project/
├── src/                  # 源代码目录
│   ├── my_package/       # 包
│   │   ├── __init__.py   # 标识包
│   │   ├── module1.py    # 模块
│   │   ├── module2.py    # 模块
│   ├── main.py           # 脚本(入口点)
├── tests/                # 测试目录
│   ├── test_module1.py   # 测试脚本(模块)
├── data/                 # 数据目录
│   ├── input.csv         # 数据文件

使用场景

  • 目录:用于组织文件,如src/tests/data/
  • 脚本:实现主逻辑,如main.py
  • 模块:实现特定功能,如module1.py
  • :组织模块,如my_package/
代码示例
# src/my_package/module1.py
def greet():
    return "Hello from module1!"
# src/my_package/__init__.py
from .module1 import greet
# src/main.py
from my_package import greet

def main():
    print(greet())

if __name__ == "__main__":
    main()


总结

  • 目录:管理文件的物理结构。
  • 脚本:可运行的单个Python文件。
  • 模块:可重用的代码单元,通常是一个.py文件。
  • :组织模块的逻辑单元,包含__init__.py文件。

        这四者在Python项目中相辅相成:脚本和模块都是代码文件,脚本用于实现功能,模块用于封装代码。目录和包都是文件目录结构,目录用于组织文件,包用于组织模块。

        关于在具体实践中使用import对模块和包的导入过程,见关于python的import

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity学习笔记(二)如何制作角色动画

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 创建一个角色 我们的目的是创建一个可移动、跳跃、冲刺等动作的角色 需要的组件:Rigidbody(用于创建物理规则)、Collider(用于检测碰撞&am…

嵌入式入门Day30

IO Day5 线程相关函数pthread_createpthread_selfpthread_exitpthread_join\pthread_detachpthread_cancelpthread_setcancelstatepthread_setcanceltype 作业 线程 线程是轻量化的进程,一个进程内可以有多个线程,至少包含一个线程(主线程&a…

【Ubuntu】双硬盘安装双系统 Windows 和 Ubuntu

【Ubuntu】双硬盘安装双系统 Windows 和 Ubuntu 1 安装顺序2 Ubutnu 20.042.1 准备工作2.2 自定义分区2.3 遇到的一些问题 1 安装顺序 我选择先在一块 SSD 上安装 Windows 再在另一块 SSD 上安装 Ubuntu,建议先安装 Windows 2 Ubutnu 20.04 2.1 准备工作 制作启…

【Qt】QWidget中的常见属性及其功能(一)

目录 一、 enabled 例子: 二、geometry 例子: window fram 例子 : 四、windowTiltle 五、windowIcon 例子: qrc机制 创建qrc文件 例子: qt中的很多内置类都是继承自QWidget的,因此熟悉QWidget的…

iOS swift开发系列 -- tabbar问题总结

1.单视图如何改为tabbar,以便显示2个标签页 右上角➕,输入tabbar 找到控件,然后选中,把entrypoint移动到tabbar控件 2.改成tabbar,生成两个item,配置各自视图后,启动发现报错 Thread 1: “-[p…

Muduo网络库解析--网络模块(2)

前文 重写Muduo库实现核心模块的Git仓库 注:本文将重点剖析 Muduo 网络库的核心框架,深入探讨作者精妙的代码设计思路,并针对核心代码部分进行重写,将原本依赖 boost 的实现替换为原生的 C11 语法。需要说明的是,本文…

电脑怎么设置通电自动开机(工控机)

操作系统:win10 第一步,电脑开机时按del键进入bios页面。 第二步,选择advanced下的IT8712 Super IO Configuration 第三步,找到Auto Power On,将其从Power off设置为Power On 第四步,F10保存,大…

如何对小型固定翼无人机进行最优的路径跟随控制?

控制架构 文章继续采用的是 ULTRA-Extra无人机,相关参数如下: 这里用于guidance law的无人机运动学模型为: { x ˙ p V a cos ⁡ γ cos ⁡ χ V w cos ⁡ γ w cos ⁡ χ w y ˙ p V a cos ⁡ γ sin ⁡ χ V w cos ⁡ γ w sin ⁡ χ…

基于Redis实现令牌桶算法

基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制(流量不均匀或变化的衡量标准)。它还可以用作调度算…

学习threejs,局部纹理刷新,实现图片分块加载

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 贴图 二、&#x1…

超标量处理器设计笔记(10) 寄存器重命名过程的恢复、分发

重命名 寄存器重命名过程的恢复使用 Checkpoint 对 RAT 进行恢复使用 WALK 对 RAT 进行恢复使用 Architecture State 对 RAT 进行恢复总结 分发(Dispatch) 寄存器重命名过程的恢复 当发生异常、分支预测失败时,指令占用 RAT、ROB 和 Issue …

海康萤石摄像机接入EasyNVR流程:开启RTSP-》萤石视频添加到EasyNVR-》未来支持海康SDK协议添加到EasyNVR

EasyNVR目前支持GB28181、RTSP、ONVIF、RTMP(推流)这几种协议接入,目前正在增加海康HIKSDK、大华DHSDK等几种SDK的接入,我们今天就介绍一下萤石摄像机怎么通过RTSP接入到EasyNVR。 第一步:萤石摄像机开启 萤石设备默…

Qt编写的文件传输工具

使用QT编写的文件传输工具 文件传输工具通过发送udp广播消息将IP广播给其他开启该程序的局域网机器 文件传输工具 通过发送udp广播消息将IP广播给其他开启该程序的局域网机器 收到的广播消息可以显示在IP地址列表中,点击IP地址可以自动填充到IP地址栏内 选择文件…

【潜意识Java】深入理解 Java 面向对象编程(OOP)

目录 什么是面向对象编程(OOP)? 1. 封装(Encapsulation) Java 中的封装 2. 继承(Inheritance) Java 中的继承 3. 多态(Polymorphism) Java 中的多态 4. 抽象&…

PWM调节DCDC参数计算原理

1、动态电压频率调整DVFS SOC芯片的核电压、GPU电压、NPU电压、GPU电压等,都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS(Dynamic Voltage and Frequency scaling),优化性能和功耗。 比如某SOC在…

OpenCV相关函数

一、二值化函数(threshold) 功能:将灰度图像转换为二值图像,通常用于图像分割。通过设置阈值,把图像中低于阈值的像素设为0,高于阈值的像素设为1。 参数: src:输入图像。 thresh&a…

bean后处理器的作用

这是beanFactory中常见的一些后处理器: 其中这俩个属于bean后处理器: internalAutowiredAnnotationProcessor解析Autowired、Value internalCommonAnnotationProcessor解析Resource、PostConstruct、PreDestroy Bean后处理器的作用:为Bean…

YOLOv11融合[CVPR2024]Starnet中的star block取模块

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接:https://arxiv.org/abs/2403.19967 代码链接:https://github.com/ma-xu/Rewri…

日常灵感:听劝是一种天赋

希望这段分享能给你提供一些新的角度,让你在自己的工作和生活中更好地利用这份“听劝”的天赋! 父与子的救赎:听劝的天赋 学霸爸爸李先生是一个典型的"别人家的父母"。 他从小就是学霸,凭借过硬的学习能力从重点高中一…

The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论

讨论 论法学硕士研究与Agent研究的互利性 近年来,随着激光诱导金属化技术的发展,激光诱导金属化与化学剂交叉领域的研究取得了长足的进步,促进了这两个领域的发展。在此,我们期待着LLM研究和Agent研究相互提供的一些益处和发展机…