在R中调用含singularity exec的Shell脚本报错:singularity命令未找到
解决R中调用bash脚本时找不到singularity命令的问题
这个问题的核心原因是:R的system()函数启动的shell环境,和你直接在命令行操作的登录shell环境不一样——登录shell会加载~/.bashrc、~/.profile这类配置文件,把singularity的执行路径添加到PATH环境变量里;但system()默认用的是非交互式/非登录shell,不会自动加载这些配置,导致脚本找不到singularity命令。
下面是几种可行的解决方法:
方法1:在脚本中使用singularity的绝对路径
- 先在命令行执行
which singularity,得到singularity的完整路径(比如/usr/local/bin/singularity) - 修改bash脚本里的命令,把
singularity exec替换成绝对路径形式,比如:/usr/local/bin/singularity exec your_container.sif your_command
这种方法最直接,完全不依赖环境变量。
方法2:在脚本开头手动设置PATH
在bash脚本的最开头,添加一行命令,把singularity所在的目录添加到PATH里:
# 替换成你实际的singularity路径目录,比如/usr/local/bin export PATH="/path/to/singularity/directory:$PATH" # 后面的原有脚本内容不变 singularity exec your_container.sif your_command
如果不确定目录,用dirname $(which singularity)可以直接得到目录路径。
方法3:在R的system()调用中传递完整环境变量
在R里先获取当前用户登录shell的PATH,然后调用脚本时把这个PATH传进去:
# 获取用户登录shell的PATH user_path <- system("echo $PATH", intern = TRUE) # 调用脚本时传递环境变量 system("./script.sh", env = c(paste0("PATH=", user_path)))
这样脚本会使用和你命令行相同的PATH环境,自然能找到singularity。
内容的提问来源于stack exchange,提问作者anria
相关产品推荐
相关产品推荐

