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

时间:2017-10-10 18:34:10

标签: python r bash configuration path

问题

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

  1. 切换到Python 3.4
  2. 运行此脚本
  3. 切换回Python 2.7
  4. 将结果导入R
  5. 要在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
    

    这似乎是我的PATH的一个问题。我正在使用正确的shell:

    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时,我仍然遇到PATH问题:

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

1 个答案:

答案 0 :(得分:0)

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

要使用.bashrc中的功能,您必须bash来运行它:

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

编辑:关闭单引号的位置。