使用sbatch执行Python脚本时subprocess无法找到tcsh脚本路径
我有一个Python脚本startup.py,通过subprocess.call()调用tcsh脚本test.sh。在集群主目录直接执行Python脚本时一切正常,但使用sbatch提交Slurm任务时失败,提示找不到目标脚本。
相关文件信息
Python脚本 startup.py(路径:/home/myname/anaconda/pro/myPy/startup.py)
mycomp='/home/myname/' import compileall compileall.compile_dir(mycomp+'anaconda/pro/myPy/', force=1) import subprocess as subs subs.call(mycomp+'anaconda/pro/myRun/test.sh', shell=True)
tcsh脚本 test.sh(路径:/home/myname/anaconda/pro/myRun/test.sh)
脚本开头为#!/bin/tcsh,具备可执行权限:
-rwxr-xr-x 1 myname myname 80891 abr 4 18:32 test.sh
Slurm脚本 config.sh(版本:slurm 0.4.3,路径:/home/myname/config.sh)
#!/bin/sh #SBATCH -A 16cores #SBATCH --ntasks=1 #SBATCH --cpus-per-task=16 #SBATCH --job-name=300 #SBATCH --error=300.err #SBATCH --output=300.out #SBATCH --partition=all #SBATCH --time=60-00:00:00 export OMP_NUM_THREADS=16 ### 切换到工作目录; cd ~/anaconda/pro/myPy/ ### 运行: python startup.py
执行命令与错误信息
执行命令:
myname@mycluster:~$ sbatch config.sh
300.err中的错误内容:
/bin/sh: 1: /home/myname/anaconda/pro/myRun/test.sh: not found
可能的原因及解决办法
计算节点上tcsh解释器路径不对
错误提示的“not found”常被误解为脚本不存在,但实际可能是脚本开头指定的#!/bin/tcsh在Slurm调度的计算节点上找不到。登录到任意计算节点执行which tcsh,得到实际路径后替换test.sh开头的解释器路径,比如改为#!/usr/bin/tcsh。目标目录在计算节点未挂载
集群主目录或/home/myname/anaconda/pro/myRun/可能未在计算节点上正确挂载,导致脚本不可访问。可以在Slurm脚本的python startup.py前添加ls /home/myname/anaconda/pro/myRun/test.sh命令,验证是否能找到文件;若确实无法访问,联系集群管理员确认目录挂载配置。subprocess调用的shell环境差异
直接执行Python脚本时用的是tcsh环境,而Slurm脚本使用#!/bin/sh作为默认shell,环境差异可能引发路径解析问题(即使使用绝对路径)。建议修改subprocess.call的调用方式,显式指定tcsh解释器并避免shell=True,更可靠的写法:subs.call(['tcsh', mycomp+'anaconda/pro/myRun/test.sh'])
内容的提问来源于stack exchange,提问作者firefly2517

