HPC集群中R Shiny执行bash脚本遇module命令未找到问题求解决
解决HPC中Shiny/Python调用脚本找不到
module命令的问题 核心原因
HPC集群的module命令通常通过交互式登录shell的配置文件(如~/.bashrc、~/.bash_profile,或集群全局的/etc/profile.d/modules.sh)初始化。但Shiny或Python调用system/subprocess启动的是非交互式非登录shell,不会自动加载这些配置,因此找不到module命令。
方案1:修改commands.sh脚本,手动加载module环境
让脚本独立于shell环境运行,在开头添加module工具的初始化命令:
# 加载集群的module初始化脚本(路径根据集群实际情况调整,常见路径示例) source /etc/profile.d/modules.sh # 若集群的module初始化在用户bash配置中,也可加载~/.bashrc # source ~/.bashrc # 原有工作流命令 module load python module load java/11.0.8 # 后续工作流执行命令...
注:如果不知道初始化脚本路径,可在命令行执行echo ${MODULESHOME},通常初始化脚本位于${MODULESHOME}/init/bash
方案2:在R Shiny中指定交互式shell执行脚本
修改Shiny的system命令,强制用交互式bash启动,自动加载配置文件:
observeEvent(input$run_extern,{ system(command = "bash -i -c '../commands.sh 2>&1 | tee ../output.log'", intern = FALSE, wait = FALSE) })
-i参数:启动交互式bash,会自动加载~/.bashrc等配置,完成module命令的初始化
方案3:Python解决方案(基于subprocess模块)
方法A:调用交互式bash执行脚本
import subprocess def run_pipeline(): cmd = "bash -i -c '../commands.sh 2>&1 | tee ../output.log'" subprocess.Popen(cmd, shell=True)
方法B:手动加载module环境后执行脚本
import subprocess def run_pipeline(): cmd = """ source /etc/profile.d/modules.sh ../commands.sh 2>&1 | tee ../output.log """ subprocess.Popen(cmd, shell=True, executable="/bin/bash")
内容的提问来源于stack exchange,提问作者user5249203
相关产品推荐
相关产品推荐

