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 30 Python
python实现SMTP邮件发送功能
Jun 16 Python
python中的tcp示例详解
Dec 09 Python
python ipset管理 增删白名单的方法
Jan 14 Python
python实现淘宝秒杀脚本
Jun 23 Python
详解Python学习之安装pandas
Apr 16 Python
Python 实现数组相减示例
Dec 27 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
python判断元素是否存在的实例方法
Sep 24 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 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+Html+缓存
2006/11/25 PHP
php microtime获取浮点的时间戳
2010/02/21 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
总结表彰大会主持词
2014/03/26 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
综治目标管理责任书
2015/05/11 职场文书
寻找成龙观后感
2015/06/12 职场文书
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB