Python导入父文件夹中模块并读取当前文件夹内的资源


Posted in Python onNovember 19, 2020

在某些特殊情况下,我们的 Python 脚本需要调用父目录下的其他模块。例如:

Python导入父文件夹中模块并读取当前文件夹内的资源

在编写 GNE 的测试用例时,有一个脚本 generate_new_cases.py放在 tests文件夹中。而 tests 文件夹与 gne 文件夹放在同一个位置。其中 gne 文件夹是一个包。我现在需要从generate_new_cases.py 文件中导入 gne 里面的一个类GeneralNewsExtractor。

为了简化问题,我单独写了一个演示的样例。它的文件结构与每个文件中的内容如下:

Python导入父文件夹中模块并读取当前文件夹内的资源

现在,我直接在 scripts 文件夹里面运行run.py会报错,提示从包的最顶层之外相对导入。

现在,我们改一下代码,尝试在scripts 文件夹的父文件夹中运行代码,发现还是会报错:

Python导入父文件夹中模块并读取当前文件夹内的资源

我们再来改一下代码,在 scripts 文件夹中,把父文件夹加入到sys.path中:

import sys
sys.path.append('..')

运行效果如下图所示:

Python导入父文件夹中模块并读取当前文件夹内的资源

这种写法,当我们在scripts 文件夹里面运行run.py时,确实已经正常了。但是如果我们在scripts文件夹的父文件夹再运行代码,又不对了,如下图所示:

Python导入父文件夹中模块并读取当前文件夹内的资源

为了检查这个原因,我们打印一下sys.path:

Python导入父文件夹中模块并读取当前文件夹内的资源

大家有没有发现一个很不和谐的东西:其他路径都是绝对路径,就最后我们加了两个点看起来很违和。那如果我们把这两个点换成绝对路径呢?于是尝试获取当前正在运行的这个文件的绝对路径:

import sys
from pathlib import Path
current_folder = Path(__file__).absolute().parent
father_folder = str(current_folder.parent)
sys.path.append(father_folder)

运行效果如下图所示:

Python导入父文件夹中模块并读取当前文件夹内的资源

导入模块已经正常了,但是读取资源文件又异常了。

这是因为,import导入模块时,是根据sys.path中的路径来寻找的。但是读取资源文件的时候,相对文件路径是相对于工作区来寻找的。

现在我们在~/test_import_father_module执行python3 scripts/run.py,那么当前的工作区就是~/test_import_father_module。而由于资源文件是在scripts文件夹中的,所以就找不到。

所以我们还需要修改一下工作区:

import os
from pathlib import Path
current_folder = Path(__file__).absolute().parent
os.chdir(str(current_folder))

运行效果如下图所示:

Python导入父文件夹中模块并读取当前文件夹内的资源

现在无论是读取资源文件还是导入模块,都已经正常了。

我们再回到 scripts 文件夹中执行看看:

Python导入父文件夹中模块并读取当前文件夹内的资源

发现也能正常执行。

总结

涉及到模块导入相关的环境,可以通过在sys.path添加绝对路径来解决。涉及到读取资源文件的相关环境,可以通过使用os.chdir修改工作区为另一个绝对路径来解决。

到此这篇关于Python导入父文件夹中模块并读取当前文件夹内资源的文章就介绍到这了,更多相关Python导入父文件夹模块并读取资源内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中使用lambda高效操作列表的教程
Apr 24 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
Python中动态创建类实例的方法
Mar 24 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
Python3 批量扫描端口的例子
Jul 25 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
python 写一个性能测试工具(一)
Oct 24 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Pytorch实验常用代码段汇总
Nov 19 #Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
Nov 19 #Python
python基于pygame实现飞机大作战小游戏
Nov 19 #Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 #Python
python3 os进行嵌套操作的实例讲解
Nov 19 #Python
如何创建一个Flask项目并进行简单配置
Nov 18 #Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 #Python
You might like
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python实现序列化及csv文件读取
2020/01/19 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
教师师德反思材料
2014/02/15 职场文书
安全生产专项整治方案
2014/05/06 职场文书
社区禁毒工作方案
2014/06/02 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
学校会议通知范文
2015/04/15 职场文书
实习报告范文
2019/07/30 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript