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 datetime时间格式化去掉前导0
Jul 31 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
python+Django+apache的配置方法详解
Jun 01 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
Django中URL的参数传递的实现
Aug 04 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
python进行参数传递的方法
May 12 Python
Django使用Profile扩展User模块方式
May 14 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
python读文件逐行处理的示例代码分享
2013/12/27 Python
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python动态视频下载器的实现方法
2019/09/16 Python
基于python3实现倒叙字符串
2020/02/18 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
金融专业个人求职信
2013/09/22 职场文书
倡议书范文格式
2014/05/12 职场文书
志愿者宣传口号
2014/06/17 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
2015年导购员工作总结
2015/04/25 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis