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学习笔记 下载
Feb 10 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
python实现录音小程序
Oct 26 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
django实现模型字段动态choice的操作
Apr 01 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
Python利用myqr库创建自己的二维码
Nov 24 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中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
Yii框架安装简明教程
2020/05/15 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python获取linux主机ip的简单实现方法
2016/04/18 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python获取Pandas列名的几种方法
2019/08/07 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
opencv实现图像平移效果
2021/03/24 Python
房产转让协议书
2014/04/11 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
迁户口计划生育证明
2014/10/19 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
统招统分证明
2015/06/23 职场文书
靠谱的活动总结
2019/04/16 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
Python多个MP4合成视频的实现方法
2021/07/16 Python
webpack的移动端适配方案小结
2021/07/25 Javascript
python井字棋游戏实现人机对战
2022/04/28 Python