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实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
python提取页面内url列表的方法
May 25 Python
深入理解Python3中的http.client模块
Mar 29 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 Python
python plotly绘制直方图实例详解
Jul 22 Python
python获取Pandas列名的几种方法
Aug 07 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
超级实用的8个Python列表技巧
Aug 24 Python
Python importlib模块重载使用方法详解
Oct 13 Python
pycharm如何设置官方中文(如何汉化)
Dec 29 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/02/19 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
python学生管理系统
2019/01/30 Python
Python提取频域特征知识点浅析
2019/03/04 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
pycharm显示远程图片的实现
2019/11/04 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
python实现PCA降维的示例详解
2020/02/24 Python
浅析matlab中imadjust函数
2020/02/27 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
pytorch中index_select()的用法详解
2021/01/06 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
实习单位接收函
2014/01/11 职场文书
拾金不昧的表扬信
2014/01/16 职场文书
劳资协议书范本
2014/04/23 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2016春季运动会前导词
2015/11/25 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
JS实现数组去重的11种方法总结
2022/04/04 Javascript