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实现LRU算法的2种方法
Jun 24 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
Python 函数基础知识汇总
Mar 09 Python
python简易远程控制单线程版
Jun 20 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
python模拟斗地主发牌
Apr 22 Python
python异步Web框架sanic的实现
Apr 27 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 Python
python画条形图的具体代码
Apr 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
php除数取整示例
2014/04/24 PHP
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
vuex实现购物车功能
2020/06/28 Javascript
Python函数学习笔记
2008/10/07 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python自动登录126邮箱的方法
2015/07/10 Python
python字符串连接方法分析
2016/04/12 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
Python集合操作方法详解
2020/02/09 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
策划创业计划书
2014/02/06 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android