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中 __get__和__getattr__和__getattribute__的区别
Jun 16 Python
Python正则表达式使用范例分享
Dec 04 Python
Python科学计算之NumPy入门教程
Jan 15 Python
python爬取淘宝商品详情页数据
Feb 23 Python
解决python报错MemoryError的问题
Jun 26 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
基于python和flask实现http接口过程解析
Jun 15 Python
Django模型验证器介绍与源码分析
Sep 08 Python
pip install命令安装扩展库整理
Mar 02 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
BBS(php & mysql)完整版(三)
2006/10/09 PHP
PHP生成月历代码
2007/06/14 PHP
实用函数2
2007/11/08 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
解决laravel session失效的问题
2019/10/14 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python实现的矩阵类实例
2017/08/22 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
检察院起诉书
2015/05/20 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
尝试使用Python爬取城市租房信息
2022/04/12 Python