首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R: system()不能使用.bashrc中定义的bash函数

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

Stack Overflow用户
提问于 2017-10-10 18:34:10
回答 1查看 665关注 0票数 5

问题

我的默认Python是2.7,但是我的脚本需要Python3.4。我试图在R中创建一个函数,它将:

  1. 切换到Python3.4
  2. 运行此脚本
  3. 切换回Python2.7
  4. 将结果导入R

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

代码语言:javascript
复制
use Python-2.7
use Python-3.4

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

代码语言:javascript
复制
system('use Python-3.4')
sh: use: command not found

这似乎是我的道路上的一个问题。我使用的是正确的shell:

代码语言:javascript
复制
system('echo $SHELL')
/bin/bash

我的$PATH变量看起来也不错。但是,当我创建一个脚本时,基本上是这样做的:

load_py34.sh:

代码语言:javascript
复制
#!/bin/bash
source ~/.bashrc
use Python-3.4

然后通过R调用这个脚本,然后它实际上会运行,但是由于某种原因,它不会在R中更改我的python版本(我已经验证了这个脚本在命令行中工作)。

代码语言:javascript
复制
> 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

所以我有点困惑,但如果有人能帮忙,我会很感激的。

建议修正

当我将它们组合成一个命令时,仍然存在相同的问题:

代码语言:javascript
复制
> system("sh load_py34.sh; python --version")
Prepending: Python-3.4 (already loaded)
Python 2.7.1

当我尝试直接调用bash时,路径仍然有问题:

代码语言:javascript
复制
> system("bash -c 'use Python-3.4; python --version'")
bash: use: command not found
Python 2.7.1
EN

回答 1

Stack Overflow用户

发布于 2021-10-10 19:41:48

.bashrc只为交互式bash会话加载。

"use“是在我的.bashrc文件中导入的bash函数。它设置了我所有的路径变量。

如果通过export设置,则不会更改调用进程的环境。

出口-fnname=word] ..。所提供的名称被标记为自动导出到随后执行的命令的环境。(https://man7.org/linux/man-pages/man1/bash.1.html)

子进程通常不能访问父进程的环境。(这带来了一个问题,因为system()创建了一个子进程。)

source.内置程序在当前的shell环境中执行命令,这就是脚本工作的原因。

其他命令(可执行的、非shell构建的)由叉和-exec机制执行,执行的shell进程分叉,创建具有相同环境和状态的子进程。这个新的子进程是执行命令的进程。对该进程的环境的更改不会复制到父进程的环境中。

这意味着您将无法依赖system('...')来修改R进程的环境或后续system()调用生成的进程的环境。

在对system()的一次调用中,您可以构造一个命令行来更改生成的shell的环境,如下所示:

代码语言:javascript
复制
bash -c 'source ~/.bashrc; use Python-3.4; python --version'

请注意,~/.bashrc并不是放置此功能的最佳位置(可能是主观的)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46673627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档