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 相关文章推荐
Python3访问并下载网页内容的方法
Jul 28 Python
Python爬虫爬验证码实现功能详解
Apr 14 Python
利用python实现数据分析
Jan 11 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
python的dataframe和matrix的互换方法
Apr 11 Python
numpy.where() 用法详解
May 27 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
Python 类属性与实例属性,类对象与实例对象用法分析
Sep 20 Python
python上传时包含boundary时的解决方法
Apr 08 Python
python将dict中的unicode打印成中文实例
May 11 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
刚才在简化php的库,结果发现很多东西
2006/12/31 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
orm获取关联表里的属性值
2016/04/17 PHP
js null undefined 空区别说明
2010/06/13 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python制作图片缩略图
2019/04/30 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
个人自我鉴定
2013/11/07 职场文书
军训自我鉴定
2013/12/14 职场文书
捐书寄语赠言
2014/01/18 职场文书
公务员转正考察材料
2014/02/07 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
python中的被动信息搜集
2021/04/29 Python
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python