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 04 Python
Python类的动态修改的实例方法
Mar 24 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
利用python如何在前程无忧高效投递简历
May 07 Python
wxPython实现列表增删改查功能
Nov 19 Python
Django ModelForm操作及验证方式
Mar 30 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
在pycharm中无法import所安装的库解决方案
May 31 Python
python爬取某网站原图作为壁纸
Jun 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
?繁体转换的class
2006/10/09 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
python元组操作实例解析
2014/09/23 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
python绘制立方体的方法
2018/07/02 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
如何现实servlet的单线程模式
2014/08/05 面试题
行政部主管岗位职责
2013/12/28 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
AJAX实现省市县三级联动效果
2021/10/16 Javascript