R: system() 不能使用 .bashrc 中定义的 bash 函数

adn*_*bps 5 python bash configuration r path

我的默认 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
Run Code Online (Sandbox Code Playgroud)

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

system('use Python-3.4')
sh: use: command not found
Run Code Online (Sandbox Code Playgroud)

这似乎是我的 PATH 的问题。我正在使用正确的外壳:

system('echo $SHELL')
/bin/bash
Run Code Online (Sandbox Code Playgroud)

我的 $PATH 变量看起来也不错。但是,当我创建一个基本上执行相同操作的脚本时:

load_py34.sh:

#!/bin/bash
source ~/.bashrc
use Python-3.4
Run Code Online (Sandbox Code Playgroud)

并通过 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
Run Code Online (Sandbox Code Playgroud)

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


建议的修复

当我将它们组合成一个命令时,我仍然遇到同样的问题:

> system("sh load_py34.sh; python --version")
Prepending: Python-3.4 (already loaded)
Python 2.7.1
Run Code Online (Sandbox Code Playgroud)

当我尝试直接调用 bash 时,我仍然遇到 PATH 问题:

> system("bash -c 'use Python-3.4; python --version'")
bash: use: command not found
Python 2.7.1
Run Code Online (Sandbox Code Playgroud)

N. *_*ern 0

当你调用system()它时/bin/sh,它不是/bin/bashsh启动时不会读取您的.bashrc文件,因此它不知道您在那里定义的任何函数。

要使用 中的函数.bashrc,您必须bash运行它:

系统(“bash -c '使用Python-3.4;python --version'”)

编辑:结束单引号的放置。