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 命令行参数sys.argv
Sep 06 Python
python中PIL安装简单教程
Apr 21 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
Python 专题四 文件基础知识
Mar 20 Python
速记Python布尔值
Nov 09 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
Python全排列操作实例分析
Jul 24 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
利用Tensorflow的队列多线程读取数据方式
Feb 05 Python
Python 爬虫性能相关总结
Aug 03 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 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 Transfer Code
2006/10/09 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
PHP代码加密的方法总结
2020/03/13 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
js实现动态增加文件域表单功能
2018/10/22 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
express框架下使用session的方法
2019/07/31 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
利用Python学习RabbitMQ消息队列
2015/11/30 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
python 模拟登录B站的示例代码
2020/12/15 Python
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
前台文员职责范本
2014/03/07 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
热血教师观后感
2015/06/10 职场文书
礼仪培训心得体会
2016/01/22 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS