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脚本实现DNSPod DNS动态解析域名
Feb 14 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
详解flask表单提交的两种方式
Jul 21 Python
python绘制中国大陆人口热力图
Nov 07 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
python调用webservice接口的实现
Jul 12 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python连接PostgreSQL过程解析
Feb 09 Python
python 利用opencv实现图像网络传输
Nov 12 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 Python
python实现Nao机器人的单目测距
Sep 04 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判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
python中随机函数random用法实例
2015/04/30 Python
python3爬虫怎样构建请求header
2018/12/23 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
汽车专业人才自我鉴定范文
2013/12/29 职场文书
四年级下册教学反思
2014/02/01 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
单位承诺书格式
2014/05/21 职场文书
工地安全质量标语
2014/06/07 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
终止劳动合同通知书
2015/04/16 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
Flask搭建一个API服务器的步骤
2021/05/28 Python
python之django路由和视图案例教程
2021/07/26 Python
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
SQL CASE 表达式的具体使用
2022/03/21 SQL Server