2017-10-10 22 views
1

问题R:系统()不能使用.bashrc中定义的bash函数

我的默认的Python 2.7,但我有需要Python 3.4的脚本。我想R中创建一个函数,将:

  1. 切换到Python 3.4
  2. 运行此脚本
  3. 切换回Python 2.7版
  4. 导入结果为R

要在Python版本之间切换,我使用我的群集的“dotkit”系统,如下所示:

use Python-2.7 
use Python-3.4 

“use”是一个在我的.bashrc文件中导入的bash函数。它设置了我所有的路径变量(PATH,LIBRARY_PATH,LD_LIBRARY_PATH,CPATH,C_INCLUDE_PATH等)。问题是,当我尝试调用R中这个功能,我得到以下错误:

system('use Python-3.4') 
sh: use: command not found 

看起来这是我路上的问题。我正在使用正确的外壳:

system('echo $SHELL') 
/bin/bash 

我的$ PATH变量也看起来不错。然而,当我创建一个脚本,基本上做同样的事情:

load_py34.sh:

#!/bin/bash 
source ~/.bashrc 
use Python-3.4 

和过R调用这个脚本,那么它实际运行,但由于某些原因,它不在R改变我的Python版本(我已经验证了这个脚本的命令行工作。)

> R 
> system('python --version') 
Python 2.7.1 
> system('sh load_py34.sh') 
Prepending: R-3.4 (ok) 
> system('python --version') 
Python 2.7.1 

所以我有点困惑,但如果有人能帮助,我将不胜感激。


建议的修复

当我将它们合并成一个单一的命令,我仍然有同样的问题:

> system("sh load_py34.sh; python --version") 
Prepending: Python-3.4 (already loaded) 
Python 2.7.1 

当我尝试直接调用bash中,我仍然有一个问题与路径:

> system("bash -c 'use Python-3.4; python --version'") 
bash: use: command not found 
Python 2.7.1 
+0

当我在一次调用中组合它们时,我得到同样的错误。我会更新这个问题来反映这一点。 –

回答

0

当您拨打system()它使用/bin/sh,而不是/bin/bashsh在启动时不会读取您的.bashrc文件,因此它不知道您在那里定义的任何功能。

要从.bashrc使用该功能,你必须得到bash去运行它:

system("bash -c 'use Python-3.4; python --version'")

编辑:收单引号的位置。

+0

这给了我同样的错误(请参阅更新的问题)。 –

相关问题