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中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
Python中super的用法实例
May 28 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python3个性签名设计实现代码
Jun 19 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
python实现微信小程序用户登录、模板推送
Aug 28 Python
pandas的相关系数与协方差实例
Dec 27 Python
python3 实现mysql数据库连接池的示例代码
Apr 17 Python
解决python存数据库速度太慢的问题
Apr 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
php在window iis的莫名问题的测试方法
2013/05/14 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python中的pack和unpack的使用
2018/03/12 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
公司司机岗位职责
2014/02/07 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
经营场所使用证明
2015/06/19 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android