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 django集成cas验证系统
Jul 14 Python
pygame播放音乐的方法
May 19 Python
python中redis的安装和使用
Dec 04 Python
Python配置mysql的教程(推荐)
Oct 13 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
python读写文件write和flush的实现方式
Feb 21 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
Django REST Swagger实现指定api参数
Jul 07 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
详解python内置模块urllib
Sep 09 Python
python 装饰器的基本使用
Jan 13 Python
python周期任务调度工具Schedule使用详解
Nov 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
Maps Javascript
2007/01/22 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
用Python生成器实现微线程编程的教程
2015/04/13 Python
Python最基本的输入输出详解
2015/04/25 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python制作填词游戏步骤详解
2019/05/05 Python
Python ellipsis 的用法详解
2020/11/20 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
夫妻婚内购房协议书
2014/10/05 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python