专栏名称: 脚本之家
脚本之家(jb51.net)是国内专业的网站建设资源、脚本编程学习类网站,以后将为大家分享更多有用的信息,希望大家多多支持宣传。
目录
相关文章推荐
中国城市规划  ·  规划解码 | ... ·  2 天前  
中国铁建  ·  戴和根调研在京有关单位 ·  昨天  
中国交建  ·  土石方变废为宝 ·  2 天前  
中国铁建  ·  中国铁建公开招聘公告 ·  2 天前  
新晚报  ·  占地面积25889.23平方米!哈尔滨这所学 ... ·  2 天前  
新晚报  ·  占地面积25889.23平方米!哈尔滨这所学 ... ·  2 天前  
51好读  ›  专栏  ›  脚本之家

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

脚本之家  · 公众号  ·  · 2020-09-25 17:00

正文

关注
脚本之家
,与百万开发者在一起

文 | kingname

来源:未闻Code(ID:itskingname)


在某些特殊情况下,我们的 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






请到「今天看啥」查看全文