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使用shelve模块实现简单数据存储的方法
May 20 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
pycharm 主题theme设置调整仿sublime的方法
May 23 Python
Django rest framework工具包简单用法示例
Jul 20 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
python实现烟花小程序
Jan 30 Python
pycharm快捷键汇总
Feb 14 Python
python使用Geany编辑器配置方法
Feb 21 Python
基于python实现上传文件到OSS代码实例
May 09 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 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将数据导入到Foxmail
2006/10/09 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
javascript 写类方式之一
2009/07/05 Javascript
js 内存释放问题
2010/04/25 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
express默认日志组件morgan的方法
2018/04/05 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
最大K个数问题的Python版解法总结
2016/06/16 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
python删除不需要的python文件方法
2018/04/24 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
Python实现井字棋小游戏
2020/03/09 Python
python如何删除文件、目录
2020/06/23 Python
销售助理岗位职责
2014/02/21 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
绵山导游词
2015/02/05 职场文书
教师辞职信范文
2015/02/28 职场文书
个人年终总结范文
2015/03/09 职场文书
感恩老师主题班会
2015/08/12 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
初中美术教学反思
2016/02/17 职场文书