工作目录问题,明明有该文件却import错误?

背景

最近在进行多模块集成的时候,出现了import错误的现象,虽然直接用绝对目录解决了,但是显然不优雅,在复习了有关工作目录的知识后,了解到了问题所在。故写此博客,希望对读者有所帮助。

场景说明

有两个python文件,一个是A.py一个是B.py。

A文件import B文件,由于在同一个目录下,所以直接import B。

此时在上一层目录有一个文件C.py。C文件import了A文件,当运行C文件的时候会导致A文件 import B错误。

问题原因

工作目录(也称为当前工作目录或CWD)是文件系统中的一个目录,它决定了程序在查找文件时所使用的基准路径。在Python中,当你尝试打开一个文件、读取一个模块或其他资源时,如果你没有指定完整的路径,Python通常会相对于工作目录来查找这些资源。

当A.py尝试import B时,Python解释器会在几个地方查找B.py:

  1. 内置模块(如sysos等)。
  2. 当前工作目录下的模块和包。
  3. PYTHONPATH环境变量中列出的目录。
  4. 标准库的安装位置。
  5. 第三方库的安装位置(如通过pip安装的库)。

如果B.py位于与A.py相同的目录中,并且当前工作目录不是该目录,则导入可能会失败,因为Python解释器会在当前工作目录下查找B.py,而不是A.py所在的目录。

此时的工作目录是C文件所在的目录,该目录下找不到B文件,所以 import B 会报错。

解决思路

  1. 显式指定路径:在打开文件或导入模块时,始终使用完整或相对于某个固定基准点的路径。例如,如果你知道B.py相对于A.py的位置,你可以使用from . import B(相对导入)或指定完整的包路径。

  2. 修改工作目录:在Python程序内部,你可以使用os.chdir()函数来更改当前工作目录。然而,这种方法可能会导致其他代码或模块出现路径问题,因此应谨慎使用。

  3. 使用包结构:将你的代码组织成包(即包含__init__.py文件的目录),并使用相对导入来引用包内的其他模块。这可以确保你的代码不依赖于外部的工作目录设置。

  4. 设置PYTHONPATH:在启动Python程序之前,设置PYTHONPATH环境变量,将你的模块和包的路径添加到其中。这样,Python解释器会在这些路径中查找模块,而不仅仅是当前工作目录和标准库。

  5. 使用绝对路径:在代码中始终使用绝对路径来引用文件和模块。这可以确保你的代码在任何工作目录下都能正常工作,但可能会使代码更难以移植和维护。

本编者推荐使用 1 和 3 来进行解决。

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

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

相关文章

Interposer, 基板,转接板

2. 结构与材料 3. 应用领域 4. 总结 Interposer、基板和转接板在电子封装和连接技术中各自扮演着不同的角色,以下是对它们之间区别的清晰解释: 1. 定义与功能 Interposer: 定义:Interposer是一种中介层技术,用于实现芯片之间的水平互连和垂直互连。功能:通常是一个薄型的…

鸿蒙期末项目(3)

服务器搭建完成之后,编写了诸多api用于数据传输工作(略) 编写完成之后,回到鸿蒙开发工具,开始编写搜索页面的代码。 打开搜索页面时,先会展示历史搜索记录(如果有的话),…

Kafka入门到精通(四)-SpringBoot+Kafka

一丶IDEA创建一个空项目 二丶添加相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springf…

SQL 查询中 (+) 符号的含义

您已经很好地解释了 SQL 查询中 () 符号的含义&#xff0c;它确实用于表示左外连接&#xff08;LEFT OUTER JOIN&#xff09;&#xff0c;这是 SQL 中的一种连接操作。以下是对您提供的信息的补充和完善&#xff1a; ### 左外连接&#xff08;LEFT OUTER JOIN&#xff09;&…

hudi系列-schema evolution(一)

hudi+flink在非schema on read模式下也表现出了支持一部分的schema evolution功能,本篇中测试一下在非schema on read模式下,发生各种列变更情况时数据写入与读取情况。 flink 1.14.5hudi 0.13.1mor表思路: 选择mor表是因为它的数据文件有avro和parquet两种格式,能覆盖得更…

java中常用集合(边补充)

java中开发常用集合&#xff08;边补充&#xff09; 一、单列集合Collection1.1List接口1.1.1 ArrayList1.1.2 LinkedList1.1.3 Vector&#xff08;线程安全&#xff09;1.1.4 CopyOnWriteArrayList&#xff08;线程安全&#xff09; 1.2 Set接口1.2.1 HashSet1.2.2 LinkedHash…

用户订单管理API:轻松管理,购物无忧

在当今数字化时代&#xff0c;电子商务已经成为人们购物的首选方式。与传统的实体店相比&#xff0c;电商的优势在于便捷、快速、多样化等特点&#xff0c;使得更多的消费者选择了通过网络购物。而作为电商平台&#xff0c;如何提供更好的购物体验&#xff0c;是每个平台都需要…

企业工程项目管理系统源码:Java版源码解析

一、项目概述 鸿鹄工程项目管理系统是基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;采用前后端分离架构构建的工程管理软件。它旨在应对企业快速发展中的管理挑战&#xff0c;提升工程管理效率&#xff0c;减轻工作负担&#xff0c;加速信息处理…

一次关于k8s的node节点NotReady的故障排查

master现象 分析 kubectl get nodes -A 看了下pod的状态&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址&#xff0c;登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务&#xff…

基于SpringBoot的藏区特产销售平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架 工具&#xff1a; MyEclipse 系统展示 首页 个人中心 特产信息管理 订单管…

华宽通中标长沙市政务共性能力建设项目,助力智慧政务建设新飞跃

在数字化浪潮的推动下&#xff0c;长沙市政府正积极拥抱智慧城市建设&#xff0c;以科技力量提升政务服务效能。华宽通凭借其卓越的技术实力与丰富的项目经验&#xff0c;成功中标长沙市政务共性能力建设项目&#xff0c;这无疑是对华宽通在智慧城市领域实力的高度认可。 华宽…

huggingface_hub 设置国内镜像

要设置HuggingFace Hub的国内镜像&#xff0c;你可以按照以下步骤进行操作&#xff0c;以确保从国内镜像站点下载Hugging Face模型和数据集。 1. 安装依赖 首先&#xff0c;确保你已经安装了huggingface_hub库。如果没有&#xff0c;可以通过pip进行安装&#xff1a; bash复制…

背部筋膜炎最有效的治疗方法

背部筋膜炎的引起原因可以归结为多个方面&#xff0c;以下是详细的分点表示和归纳&#xff1a; 1、慢性劳损&#xff1a;长时间使用背部&#xff0c;如经常按摩背部&#xff0c;会导致筋膜老化、发炎&#xff0c;进而引发背部筋膜炎。症状可能包括背部疼痛、痉挛、肌肉无力感等…

Python 判断for循环最后一次的6种方法

在Python中&#xff0c;通常我们不会直接判断for循环是否正在执行最后一次迭代&#xff0c;因为Python的for循环是基于可迭代对象的&#xff0c;它不知道也不关心迭代的内部状态&#xff08;比如当前是第几次迭代&#xff09;。但是&#xff0c;我们可以使用一些技巧来间接地实…

uboot环境变量操作命令setenv和saveenv

uboot启动的时候会将环境变量从flash读取到DRAM中,使用命令 setenv修改的是DRAM中环境变量,修改以后要使用saveenv命令将修改 后的环境变量保存到flash中,否则的话uboot下一次重启会继续使用以前的环境变量值.setenv setenv - set environment variables Usage: setenv seten…

LeetCode.295数据流的中位数详解

问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 Medi…

Advantest 93000测试机中CLOCK DOMAIN 详解

爱德万测试&#xff08;Advantest&#xff09;的V93000系列测试系统是一个高度模块化和可扩展的平台&#xff0c;专为复杂和高性能的半导体器件测试而设计&#xff0c;包括系统级芯片&#xff08;SoC&#xff09;、存储器、射频&#xff08;RF&#xff09;和混合信号器件等。在…

剪画小程序:从失业到自媒体:37岁的勇敢转身!

37岁啦&#xff0c;按说这年纪工作该稳稳当当&#xff0c;家庭也和和美美。可谁能想到&#xff0c;我竟然失业了&#xff01;当时啊&#xff0c;心里头那叫一个迷茫、焦虑&#xff0c;感觉天都要塌下来了。 可日子还得过呀&#xff0c;总不能就这么被生活给打倒&#xff01;现在…

白敬亭章若楠甜度报表的难哄大师

#白敬亭章若楠&#xff0c;甜度爆表的难哄大师#&#x1f389;&#x1f389;&#x1f389;各位小伙伴们&#xff0c;你们还记得那个让我们心跳加速、嘴角上扬的CP组合吗&#xff1f;没错&#xff0c;就是白敬亭和章若楠&#xff01;他们可是凭借一部新剧&#xff0c;再次让我们感…

antd中Select大数据分页触底刷新处理优化

平时使用antd中Select的下拉一般就几十几百条&#xff0c;这时候直接使用组件模糊查询就能实现大部分业务场景需求。 今天遇到一个需要模糊查询并且总量上万条的下拉框&#xff0c;如果一次性怼上去上万条&#xff0c;会造成浏览器卡顿。所以这边采用后端分页&#xff0c;前端…