在某些特殊情况下,我们的 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列出文件夹下所有文件

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。