我正在使用集群管理器slurm,我正在使用sbatch运行提交脚本(使用python interpeter)。 sbatch提交导入了我的一个名为main_nn.py
的模块。该模块与我的提交目录位于同一位置,但是,即使该文件存在,python也无法找到它。我很难搞清楚为什么会发生这种情况。我的python文件如下所示:
#!/usr/bin/env python
#SBATCH --job-name=Python
print('hi')
import main_nn
然而我的slurm转储文件的输出是:
hi
Traceback (most recent call last):
File "/home/slurm/slurmd/job3223398/slurm_script", line6, in <module>
import main_nn
ImportError: No module named main_nn
我尝试检查模块main_nn
是否在当前目录中,确实存在。因此,对我来说似乎可疑的第一件事是slurm文件中的错误表示我的脚本位于"/home/slurm/slurmd/job3223398/slurm_script"
而不是path_to_project
。因此,我继续添加了一行
os.system('pwd')
查看我的脚本执行的位置,令我惊讶的是它在path_to_project
而不是"/home/slurm/slurmd/job3223398/slurm_script"
处执行,这必然意味着sbatch正在做一些时髦的事情来在一个位置执行脚本但是它认为它在另一个。如果是这种情况我怎么想在python中进行导入,其中模块与我的提交脚本位于同一位置?我是否被迫将它放在一个包中并欺骗python以在包/库中思考它?
答案 0 :(得分:3)
当Slurm将提交脚本复制到计算节点上的特定位置以运行它时,您的Python脚本将找不到提交目录中的模块。
但是Slurm正确设置了当前工作目录,因此您可以使用以下内容将其显式添加到python路径:
sys.path.append(os.getcwd())
靠近脚本的开头。