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

Cha*_*ker 6 python slurm

我正在使用集群管理器slurm,并且正在使用 sbatch(使用 python interpeter)运行提交脚本。sbatch 提交导入了我的一个名为main_nn.py. 该模块与我的提交目录位于同一位置,但是,即使该文件存在,python 也无法找到它。我很难弄清楚为什么会发生这种情况。我的python文件如下所示:

#!/usr/bin/env python
#SBATCH --job-name=Python

print('hi')

import main_nn
Run Code Online (Sandbox Code Playgroud)

但是我的 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
Run Code Online (Sandbox Code Playgroud)

我尝试检查模块main_nn是否在当前目录中,并且确实在那里。因此,对我来说似乎可疑的第一件事是 slurm 文件中的错误说我的脚本的位置是 at"/home/slurm/slurmd/job3223398/slurm_script"而不是 at path_to_project。因此我继续添加了一行

os.system('pwd')
Run Code Online (Sandbox Code Playgroud)

查看我的脚本是从哪里执行的,令我惊讶的是它是path_to_project"/home/slurm/slurmd/job3223398/slurm_script"哪个位置执行的,而不是在哪个位置执行,这一定意味着 sbatch 正在做一些时髦的事情来在一个位置执行脚本,但让它认为它在另一个位置。如果是这种情况,我该如何在 python 中进行导入,其中模块与我的提交脚本位于同一位置?我是否被迫将它放在一个包中并欺骗 python 认为它在一个包/库中?

dam*_*ois 6

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

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

sys.path.append(os.getcwd()) 
Run Code Online (Sandbox Code Playgroud)

靠近脚本的开头。

  • 有没有办法提高他们对这个问题的认识?在我看来,它甚至不应该存在的问题类型。 (2认同)