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中的floor()方法
May 15 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
python输出决策树图形的例子
Aug 09 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
python 读取串口数据的示例
Nov 09 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 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
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
PHP源码之explode使用说明
2011/08/05 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
js 动态选中下拉框
2009/11/26 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
JavaScript实现前端分页控件
2017/04/19 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python解析基于xml格式的日志文件
2017/02/25 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
python实现最速下降法
2020/03/24 Python
SQL面试题
2013/04/30 面试题
销售行政专员职责
2014/01/03 职场文书
函授毕业自我鉴定
2014/02/04 职场文书
读群众路线心得体会
2014/03/07 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
酒会邀请函
2015/01/31 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
Python机器学习之基础概述
2021/05/19 Python