将python子进程与模块加载一起使用

时间:2016-04-28 08:56:50

标签: python r subprocess

我目前在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,但无法使其正常工作。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

那么“模块加载”实际上是在调用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

答案 1 :(得分:0)

与以下内容完美配合:

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

感谢您的回答!