问题
我的默认Python是2.7,但是我的脚本需要Python3.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这似乎是我的道路上的一个问题。我使用的是正确的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时,路径仍然有问题:
> system("bash -c 'use Python-3.4; python --version'")
bash: use: command not found
Python 2.7.1发布于 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的环境,如下所示:
bash -c 'source ~/.bashrc; use Python-3.4; python --version'请注意,~/.bashrc并不是放置此功能的最佳位置(可能是主观的)。
https://stackoverflow.com/questions/46673627
复制相似问题