【问题标题】:Using python subprocess with module load使用带有模块加载的python子进程
【发布时间】:2016-04-28 08:56:49
【问题描述】:

我目前在 unix 环境中使用 Python 2.7。 我需要在我的 python 脚本中运行 R 脚本,但我无法让它工作,因为我的 R 模块需要先加载(使用“模块加载”)

这是我的 python 脚本:

import os
import subprocess as sp

os.system('module load R/3.2.3')
out = sp.check_output(['Rscript','test.R'], universal_newlines=True)

我一直有同样的错误:“[Errno 2] 没有这样的文件或目录”

有什么想法吗? 我查看了herehere,但无法正常工作。

感谢您的帮助!

【问题讨论】:

  • 发布整个堆栈跟踪。还要注意脚本所在的位置,python 和 R 脚本,为方便起见,您可以将它们全部放在同一个目录中。
  • test.R 在你的工作目录中吗?

标签: python r subprocess


【解决方案1】:

所以“模块加载”实际上所做的是在调用 shell 中设置一些环境变量。所以当你这样做时:

os.system('module load R/3.2.3')

Python 创建一个进程,在其中运行/bin/sh,然后将该命令传递给shell。模块环境变量在该 shell 中设置。然后那个 shell 退出——工作完成!

环境变量不会——也不能——传播回 Python 进程。所以当你这样做时:

sp.check_output(['Rscript','test.R'])

你之前跑过module load是完全不相关的。

那么你怎么能解决这个问题呢?好吧,一种可能性是明确指定Rscript 的路径:

sp.check_output(['/your/full/path/to/Rscript','test.R'])

另一个是结合你的命令:

sp.check_output('module load R/3.2.3 && Rscript test.R', shell=True)

最后,您可以在运行 Python 脚本之前简单地运行 module load。它设置的环境变量可以一直传播到 Python 中的 R 调用。

顺便说一句,可以直接从 Python 调用 R:http://rpy.sourceforge.net/rpy2/doc-dev/html/introduction.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2011-12-05
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多