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

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

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

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

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

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

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

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

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

运行效果如下图所示:

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

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

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

  1. import sys 
  2. from pathlib import Path 
  3. current_folder = Path(__file__).absolute().parent 
  4. father_folder = str(current_folder.parent) 
  5. sys.path.append(father_folder) 

运行效果如下图所示:

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

这是因为,import导入模块时,是根据sys.path中的路径来寻找的。但是读取资源文件的时候,相对文件路径是相对于工作区来寻找的。

现在我们在~/test_import_father_module执行python3 scripts/run.py,那么当前的工作区就是~/test_import_father_module。而由于资源文件是在scripts文件夹中的,所以就找不到。

所以我们还需要修改一下工作区:

  1. import os 
  2. from pathlib import Path 
  3. current_folder = Path(__file__).absolute().parent 
  4. os.chdir(str(current_folder)) 

运行效果如下图所示:

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

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

发现也能正常执行。

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

 

责任编辑:赵宁宁 来源: 未闻Code
相关推荐

2021-02-18 22:07:08

Python项目文件

2023-03-28 15:19:37

文件列表scandir函数

2009-08-12 16:57:28

C#读取文件夹

2009-12-03 10:18:32

Linux文件夹执行权限

2011-08-04 15:36:32

文件夹病毒

2010-12-31 13:35:25

文件夹重定向

2021-04-01 16:36:07

macOS文件夹磁盘

2014-02-12 10:58:05

Linux文件夹文件权限

2010-03-25 10:24:32

Python代码

2011-08-02 09:38:58

ActiveDirec域控制器共享文件夹

2011-03-04 16:37:13

FileZilla

2022-07-08 15:09:26

Linux

2020-04-15 18:46:19

WindowsLinux文件夹系统

2010-02-03 15:54:58

Linux SVN安装

2022-11-16 16:28:21

2021-08-16 13:34:07

Linux终端删除文件

2023-05-13 17:43:17

Linux文件文件夹

2013-04-03 12:57:01

Android开发读写assets目录下

2015-03-13 13:50:47

Java读取文件夹大小Java读取文件Java读取

2018-08-28 10:40:08

Windows 10EFS加密文件
点赞
收藏

51CTO技术栈公众号