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构建深度神经网络(续)
Mar 10 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
python中必要的名词解释
Nov 20 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
Apr 17 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
python 第三方库paramiko的常用方式
Feb 20 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函数extension_loaded()用法实例
2015/01/19 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
javascript实现连续赋值
2015/08/10 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
详解vuex的简单使用
2018/03/12 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
用python爬取租房网站信息的代码
2018/12/14 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python Web版语音合成实例详解
2019/07/16 Python
wxPython实现整点报时
2019/11/18 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
python能做哪方面的工作
2020/06/15 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
美国时尚在线:Showpo
2017/09/08 全球购物
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
员工评语大全
2014/01/19 职场文书
神州牡丹园的导游词
2019/11/20 职场文书