在 SLURM 中使用 sbatch 命令时如何导入本地 python 模块

How to import a local python module when using the sbatch command in SLURM

我正在使用集群管理器 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 认为它在 package/library 中?

由于 Slurm 将提交脚本复制到计算节点上的特定位置 运行,您的 Python 脚本将找不到提交目录中的模块。

但 Slurm 正确设置了当前工作目录,因此您可以使用类似以下内容将其显式添加到 python 路径:

sys.path.append(os.getcwd()) 

接近脚本开头。