python文件命名,不注意容易出错

在python中,文件名也会作为模块的名称使用。

举个例子

工程目录如下:
在这里插入图片描述

其中,文件夹为sys_check,其下还有一个sys_check1.py文件。
如果该文件名也是sys_check.py,可能会导致问题,在其它文件中引用模块时会出错。
比如,在kernel_version.py中引用common_data中的内容时:

from sys_check.common_data import *

会报如下错误:

ModuleNotFoundError: No module named 'sys_check.common_data'; 
'sys_check' is not a package

原因分析

在Python中,当我们尝试导入一个模块时,Python解释器会按照特定的顺序搜索模块。这个过程涉及到搜索路径(sys.path),包括:

  • 当前目录
  • PYTHONPATH环境变量指定的目录
  • Python安装的site-packages目录等。

当我们有一个目录和一个文件同名的情况,比如一个名为sys_check的目录和一个名为sys_check.py的文件,Python解释器在导入时会根据以下规则来处理:

文件优先

如果存在一个与模块名相同的.py文件,Python解释器会优先加载这个文件作为模块。这意味着如果有一个名为sys_check.py的文件,尝试导入sys_check时,Python会加载这个文件,而不是目录。

目录作为包

如果目录中包含一个__init__.py文件(可以是空的),Python解释器会将该目录视为一个包。这样,我们就可以从这个包中导入子模块。例如,如果sys_check目录包含__init__.py文件,那么我们可以从这个目录中导入common_data模块。
在上述提供的场景中,如果sys_check目录下有一个sys_check.py文件,当我们尝试执行以下导入语句:

from sys_check.common_data import *

Python解释器会首先查找名为sys_check.py的文件,因为它与模块名相同。由于找到了这个文件,它不会继续搜索同名的目录。这意味着sys_check目录被忽略了,即使它可能是一个包含__init__.py的包,其中可能包含common_data模块。
这就是为什么我们会收到上述错误,因为Python解释器没有将sys_check目录视为一个包,而是将sys_check.py文件作为模块加载了。

解决办法

重命名文件或目录

确保目录和文件不要同名,这样可以避免冲突。如果sys_check是一个目录,并且我们希望它作为一个包来使用,那么不要在这个目录下创建同名的sys_check.py文件,比如改成sys_check1.py,当然文件名加1并不是一个好的做法,可以改成system_check.py等。

确保目录是包

如果sys_check目录应该是一个包,确保它包含一个__init__.py文件。这样,即使目录和文件名不同,我们也可以正确地从sys_check包中导入common_data模块。
通过这种方式,我们可以避免导入时的命名冲突,并确保Python解释器能够正确地识别和加载我们的模块和包。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

给阿里云OSS启用SSL

自定义域名需要指向阿里云 OSS,并且你希望为这个域名获取 SSL 证书,可以使用 DNS 验证的方法来获取证书。以下是详细步骤: 关键前提: 关键是需要在阿里云控制台的域名 权威域名解析中添加子域名aliyuncs.xxx.com 使用 DNS 验证获取…

边缘计算在智能制造中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 边缘计算在智能制造中的应用 边缘计算在智能制造中的应用 边缘计算在智能制造中的应用 引言 边缘计算概述 定义与原理 发展历程 …

定时任务进行简单监控、爬虫的自动化之旅

原文链接:「定时任务」进阶指南:监控、爬虫的自动化之旅

『VUE』25. 组件事件与v-model(详细图文注释)

目录 功能介绍示例总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 功能介绍 预期拿到一个输入搜索框,用户在搜索框中输入数据后实时把数据发送给父组件使用. 示例 主要是对前面的v-model和watch的结合使用,实现获取更新的子…

【Python TensorFlow】进阶指南(续篇二)

在前面的文章中,我们详细探讨了TensorFlow在实际应用中的高级功能和技术细节。本篇将继续深入探讨一些前沿话题,包括但不限于分布式训练、混合精度训练、神经架构搜索(NAS)、模型微调以及在实际项目中的最佳实践等,帮助…

什么是MVC模式?

MVC 模型处理数据 控制器做传递 视图用于展示 模型Model:数据验证、逻辑和持久性,直接与数据库进行交互控制器Controller:向模型询问数据,获取所有的数据信息视图View:视图用于显示信息,根据模型来获取信息&#xff0c…

Spring Boot 接口防重复提交解决方案

文章目录 前言使用Token机制实现步骤1.生成Token2.传递Token3.验证Token 使用Redis实现步骤1.引入Redis依赖2.生成Token3.传递Token4.验证Token 使用Spring AOP实现步骤1.定义注解2.创建切面3.使用注解 总结 前言 在Web开发中,防止用户重复提交表单是一个常见的需求…

【毫米波雷达(九)】前雷达软件开发遇到的问题汇总及解决方法

前雷达软件开发遇到的问题汇总及解决方法 一、CAN/CANFD通信1、雷达CAN未能正常发出数据2、雷达在车上接收不到车身信息3、程序下载失败4、DV试验发送数据偶发断连5、发送感知信息丢帧或者丢报文6、上电发出第一帧的报文时间长7、ZCANPRO有错误帧二、协议转换(以太网…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器(Adaptive Filter)是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域,如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …

计算机网络(8)数据链路层之子层

上一篇已经讲到数据链路层可以分为两个子层,这次将重点讲解子层的作用和ppp协议 数据链路层的子层 数据链路层通常被分为两个子层: 逻辑链路控制子层(LLC,Logical Link Control): LLC子层负责在数据链路…

论文5—《基于改进YOLOv5s的轻量化金银花识别方法》文献阅读分析报告

论文报告:基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档 基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档摘要国内外研究现状国内研究现状国外研究现状 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. 目标检测技术2. …

雷池waf安装并部署防护站点

雷池waf安装并部署防护站点 最低配置要求 操作系统:Linux 指令架构:x86_64 软件依赖:Docker 20.10.14 版本以上 软件依赖:Docker Compose 2.0.0 版本以上 最小化环境:1 核 CPU / 1 GB 内存 / 5 GB 磁盘 写在前面 本文…

2024第四次随堂测验参考答案

从第四次开始答案会以c语言提供&#xff0c;自行了解&#xff0c;学习 6-1 报数 报数游戏是这样的&#xff1a;有n个人围成一圈&#xff0c;按顺序从1到n编好号。从第一个人开始报数&#xff0c;报到m&#xff08;<n&#xff09;的人退出圈子&#xff1b;下一个人从1开始报…

开源 - Ideal库 - 常用枚举扩展方法(二)

书接上回&#xff0c;今天继续和大家享一些关于枚举操作相关的常用扩展方法。 今天主要分享通过枚举值转换成枚举、枚举名称以及枚举描述相关实现。 我们首先修改一下上一篇定义用来测试的正常枚举&#xff0c;新增一个枚举项&#xff0c;代码如下&#xff1a; //正常枚举 in…

如何平滑切换Containerd数据目录

如何平滑切换Containerd数据目录 大家好&#xff0c;我是秋意零。 这是工作中遇到的一个问题。搭建的服务平台&#xff0c;在使用的过程中频繁出现镜像本地拉取不到问题&#xff08;在项目群聊中老是被人出来&#x1f605;&#xff09;原因是由于/目录空间不足导致&#xff0…

(附项目源码)Java开发语言,监督管家APP的设计与实现 58,计算机毕设程序开发+文案(LW+PPT)

摘要 随着互联网的快速发展和智能手机的普及&#xff0c;越来越多的用户选择通过移动应用程序进行事项设定、提醒通知和事项打卡。监督管家APP作为一个专注于事项设定、提醒通知、事项打卡的监督管理平台&#xff0c;具有广泛的应用前景和商业价值。本研究旨在构建一个功能丰富…

ffmpeg+D3D实现的MFC音视频播放器,支持录像、截图、音视频播放、码流信息显示等功能

一、简介 本播放器是在vs2019下开发&#xff0c;通过ffmpeg实现拉流解码功能&#xff0c;通过D3D实现视频的渲染功能。截图功能采用libjpeg实现&#xff0c;可以截取jpg图片&#xff0c;图片的默认保存路径是在C:\MYRecPath中。录像功能采用封装好的类Mp4Record实现&#xff0c…

LLM在Transformer上的改动

LLM在Transformer上的改动 1.multi-head共享1.1BERT的逻辑1.2multi-head共享 2.attention的前后网络2.1传统Transformer&#xff1a;2.2GPTJ结构&#xff1a; 3.归一化层的位置&#xff08;LayerNorm&#xff09;4.归一化层函数的选择4.1LayerNorm4.2RMSNorm 3.激活函数4.LLama…

git命令及原理

git: 目录则被称之为“树” 文件被称作 Blob 对象. git help <command>: 获取 git 命令的帮助信息 git init: 创建一个新的 git 仓库&#xff0c;其数据会存放在一个名为 .git 的目录下 git status: 显示当前的仓库状态 git add <filename>: 添加文件到暂存区 git …

scala 迭代更新

在Scala中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一种用于遍历集合&#xff08;如数组、列表、集合等&#xff09;的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素&#xff0c;而无需关心集合的具体实现。 在Scala中&#xff0c…