Python导入父文件夹中模块并读取当前文件夹内的资源

作者:kingname 时间:2023-08-27 09:03:43 

在某些特殊情况下,我们的 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修改工作区为另一个绝对路径来解决。

来源:https://mp.weixin.qq.com/s/cNKr1uhDy47pOVjFznoBwA

标签:python,导入,文件夹
0
投稿

猜你喜欢

  • Python存取XML的常见方法实例分析

    2023-07-30 07:36:38
  • Python爬虫采集微博视频数据

    2023-08-11 16:01:03
  • Python Tkinter GUI编程实现Frame切换

    2023-05-08 07:36:28
  • 使用PyV8在Python爬虫中执行js代码

    2022-05-09 14:33:36
  • Python爬虫解析网页的4种方式实例及原理解析

    2022-11-03 03:11:23
  • Python基于pyecharts实现关联图绘制

    2021-04-08 12:05:45
  • Python冲顶大会 快来答题!

    2022-05-27 08:10:56
  • Python计算多幅图像栅格值的平均值

    2021-03-28 01:41:05
  • 设计中基于人类学的田野调查与比较研究法 ——浅谈用研与竞品分析方法之理论基础

    2009-08-31 16:45:00
  • 如何使用Python的OpenCV库处理图像和视频

    2022-09-06 10:22:12
  • c++基础语法:虚继承

    2024-01-23 10:01:00
  • 解决django 新增加用户信息出现错误的问题

    2021-07-27 12:50:46
  • python实现简单的计算器功能

    2021-02-08 03:38:54
  • python字典多键值及重复键值的使用方法(详解)

    2023-03-18 14:23:15
  • Python PyQt5实战项目之查询器的实现流程详解

    2023-07-15 04:19:21
  • SQL文本字段的数字排序问题

    2008-11-18 16:47:00
  • Python自动化导出zabbix数据并发邮件脚本

    2022-08-18 12:31:46
  • python批量下载网站马拉松照片的完整步骤

    2023-08-31 19:00:27
  • 使用sklearn对多分类的每个类别进行指标评价操作

    2022-04-20 17:19:39
  • Python干货实战之八音符酱小游戏全过程详解

    2021-08-20 11:21:27
  • asp之家 网络编程 m.aspxhome.com