一日一技:导入父文件夹中的模块并读取当前文件夹内的资源

简介: 一日一技:导入父文件夹中的模块并读取当前文件夹内的资源

摄影:产品经理产品经理独自在深圳吃的早餐

在某些特殊情况下,我们的 Python 脚本需要调用父目录下的其他模块。例如:

在编写 GNE 的测试用例时,有一个脚本 generate_new_cases.py放在 tests文件夹中。而 tests 文件夹与 gne 文件夹放在同一个位置。其中 gne 文件夹是一个包。我现在需要从generate_new_cases.py 文件中导入 gne 里面的一个类GeneralNewsExtractor

为了简化问题,我单独写了一个演示的样例。它的文件结构与每个文件中的内容如下:

现在,我直接在 scripts 文件夹里面运行run.py会报错,提示从包的最顶层之外相对导入。

现在,我们改一下代码,尝试在scripts 文件夹的父文件夹中运行代码,发现还是会报错:

我们再来改一下代码,在 scripts 文件夹中,把父文件夹加入到sys.path中:

import sys
sys.path.append('..')

运行效果如下图所示:


这种写法,当我们在scripts 文件夹里面运行run.py时,确实已经正常了。但是如果我们在scripts文件夹的父文件夹再运行代码,又不对了,如下图所示:

为了检查这个原因,我们打印一下sys.path

大家有没有发现一个很不和谐的东西:其他路径都是绝对路径,就最后我们加了两个点看起来很违和。那如果我们把这两个点换成绝对路径呢?于是尝试获取当前正在运行的这个文件的绝对路径:

import sys
from pathlib import Path
current_folder = Path(__file__).absolute().parent
father_folder = str(current_folder.parent)
sys.path.append(father_folder)

运行效果如下图所示:

导入模块已经正常了,但是读取资源文件又异常了。

这是因为,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))

运行效果如下图所示:

现在无论是读取资源文件还是导入模块,都已经正常了。

我们再回到 scripts 文件夹中执行看看:

发现也能正常执行。

总结

涉及到模块导入相关的环境,可以通过在sys.path添加绝对路径来解决。涉及到读取资源文件的相关环境,可以通过使用os.chdir修改工作区为另一个绝对路径来解决。

目录
相关文章
|
6月前
如何从多个文件夹里各提取相应数量的文件放一起到新文件夹中形成多文件夹组合
该文介绍了一个工具的使用方法,通过它可以从多个文件夹中批量提取并合并文件。文中提供了两个下载链接(度娘网盘和蓝奏云)并附有提取码。工具主要用于平均分配文件到指定文件夹,例如将100张图片平均放入50个文件夹,每个文件夹2张。操作步骤包括创建目标文件夹、添加源文件夹路径、启用“平均复制”选项,然后执行任务。最后,展示了操作完成后文件夹内的正确分布情况。
156 10
|
6月前
如何从多个文件夹内转移全部文件(忽略文件夹的结构)(进行复制)(再打包)
该文介绍了一个工具的使用方法,用于忽略文件夹结构并合并所有图片。首先,提供了两个下载链接:百度网盘(提取码:qwu2)和蓝奏云(提取码:2r1z)。接着,展示了文件夹内的嵌套结构,包含多层文件夹和兔兔图片。通过打开工具,选择文件批量复制功能,勾选“忽略文件夹结构”和“不存在自动创建”,然后将目标文件夹“1”添加到来源路径。点击开始复制,并在需要时选择打包和删除原文件,最终会得到一个包含所有图片的压缩包。
|
6月前
|
Unix Linux 数据处理
使用Python批量复制文件夹及其子文件夹下的指定文件
使用Python批量复制文件夹及其子文件夹下的指定文件
270 1
|
6月前
|
定位技术 Python
Python依据某一文件夹中大量文件的名称复制另一文件夹中的同名文件
Python依据某一文件夹中大量文件的名称复制另一文件夹中的同名文件
|
XML 存储 数据格式
基于大量文件的名称特征自动新建多个文件夹并自动复制对应文件:Python
本文介绍基于Python,对一个文件夹下大量栅格影像,基于其各自文件名,分别创建指定名称的新文件夹,并将对应影像文件复制到不同的新文件夹下的方法。
148 3
基于大量文件的名称特征自动新建多个文件夹并自动复制对应文件:Python
|
6月前
创建多级文件夹 类似2021/11/22
创建多级文件夹 类似2021/11/22
34 0
VSS中上传一个文件夹(包括子文件夹和文件)
VSS中上传一个文件夹(包括子文件夹和文件)
|
JSON 数据格式
批量遍历指定类型的文件及文件夹,并将其复制到新的文件夹
批量遍历指定类型的文件及文件夹,并将其复制到新的文件夹
|
Java Maven
Maven项目获取资源文件路径并读取资源文件内容
Maven项目获取资源文件路径并读取资源文件内容
263 0
Maven项目获取资源文件路径并读取资源文件内容
|
存储 JSON 安全
electron如何自定义目录,修改文件名保存下载的网络文件
很多同学觉得用localstorage可以代替vuex, 对于不变的数据确实可以,但是当两个组件共用一个数据源(对象或数组)时,如果其中一个组件改变了该数据源,希望另一个组件响应该变化时,localstorage无法做到,原因就是区别1。
electron如何自定义目录,修改文件名保存下载的网络文件