当前位置: 首页 > 科技观察

导入父文件夹下的模块,读取当前文件夹下的资源

时间:2023-03-18 22:34:58 科技观察

在某些特殊情况下,我们的Python脚本需要调用父目录下的其他模块。例如:在为GNE编写测试用例时,在tests文件夹下有一个脚本generate_new_cases.py。并且tests文件夹和gne文件夹放在同一个位置。其中gne文件夹是一个包。我现在需要从generate_new_cases.py文件中导入gne中的GeneralNewsExtractor类。为了简化问题,我单独写了一个demo例子。它的文件结构和每个文件的内容如下:现在,如果我直接在scripts文件夹下运行run.py,会报错,提示relativeimportfromoutsideofthepacketofthepackage。现在,我们改一下代码,尝试在scripts文件夹的父文件夹中运行代码,发现还是会报错:我们再改一下代码,在scripts文件夹中,将父文件夹添加到sys.path中:导入系统。path.append('..')的运行效果如下图所示:这种写法,当我们运行scripts文件夹下的run.py时,确实是正常的。但是如果我们运行scripts文件夹的父文件夹中的代码,又报错了,如下图:是绝对路径,而且好像我们在末尾加了两个点,显得很不协调。那如果我们把这两个点换成绝对路径呢?所以尝试获取当前运行文件的绝对路径:importsysfrompathlibimportPathcurrent_folder=Path(__file__).absolute().parentfather_folder=str(current_folder.parent)sys.path。append(father_folder)运行效果如下图:导入模块正常,但是资源文件读取又出现异常。这是因为import导入模块时,是根据sys.path中的路径查找的。但是在读取资源文件时,相对于工作空间搜索相对文件路径。现在我们在~/test_import_father_module中执行python3scripts/run.py,那么当前工作空间就是~/test_import_father_module。而且由于资源文件在scripts文件夹中,所以找不到。所以我们还需要修改工作空间:importosfrompathlibimportPathcurrent_folder=Path(__file__).absolute().parentos.chdir(str(current_folder))运行效果如下图所示:现在无论是读取资源文件还是导入模块,很正常了。我们回到scripts文件夹执行:可以正常执行。总结模块导入相关的环境可以通过在sys.path中添加绝对路径来解决。读取资源文件相关的相关环境可以通过使用os.chdir修改工作区为其他绝对路径来解决。