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操作ie登陆土豆网的方法
May 09 Python
python实现马耳可夫链算法实例分析
May 20 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
Python与R语言的简要对比
Nov 14 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
python连接mongodb密码认证实例
Oct 16 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
Python 经典算法100及解析(小结)
Sep 13 Python
PYTHON如何读取和写入EXCEL里面的数据
Oct 28 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 xml常用函数的集合(比较详细)
2013/06/06 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
php+mysql数据库查询实例
2015/01/21 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
用于table内容排序
2006/07/21 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
python中self原理实例分析
2015/04/30 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
村容村貌整治方案
2014/05/21 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
经验交流材料格式
2014/12/30 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python