如何确保 slurm 中的 python 提交脚本位于发出 sbatch 命令的位置?

How does one make sure that the python submission script in slurm is in the location from where the sbatch command was given?

我有一个 python 提交脚本,我 运行 与 sbatch 使用 slurm:

sbatch batch.py

当我这样做时,事情无法正常工作,因为我假设 batch.py 进程没有继承正确的环境变量。因此,不是从完成 sbatch 命令的地方 运行ning batch.py,而是来自其他地方的 运行(我相信 /)。我设法通过用 bash 脚本包装 python 脚本来解决这个问题:

#!/usr/bin/env bash
cd path/to/scripts
python script.py

这种临时的 hack 似乎有效,尽管它似乎完全避免了问题而不是解决问题。有人知道如何以更好的方式解决这个问题吗?

例如,我知道 docker 中存在 -w-WORKDIR,因此 docker 容器知道它应该位于何处。我想知道 slurm 是否存在类似的东西。

Slurm 旨在在提交作业时将用户环境推送到作业,但用户或系统管理员明确禁用的变量除外。

但是脚本的方式 运行 如下:脚本被复制到分配的主节点上的 Slurm 特定目录中,然后从那里 运行,$PWD 设置为 sbatch 命令所在的目录 运行.

您可以使用像这样的简单脚本看到这一点:

$ cat t.sh
#!/bin/bash
#
#SBATCH --job-name=test_ms
#SBATCH --output=res_ms.txt

echo $PWD
dirname $(readlink -f "[=10=]")

$ sbatch t.sh
Submitted batch job 1109631
$ cat res_ms.txt
/home/damienfrancois/
/var/spool/slurm/job1109631

一个结果是 Python 在当前目录中导入模块的脚本无法这样做。解决方法是在导入失败之前显式添加 sys.path.append(os.getcwd())