2011-09-10 36 views
34

我试图通过类似下面的shell脚本激活VIRTUALENV但它似乎没有工作,使用shell脚本激活VIRTUALENV似乎不工作

#!/bin/sh 
source ~/.virtualenvs/pinax-env/bin/activate 

我得到以下错误

$ sh virtualenv_activate.sh 
virtualenv_activate.sh: 2: source: not found 

但如果我在终端中输入相同的命令似乎工作

$ source ~/.virtualenvs/pinax-env/bin/activate 
(pinax-env)[email protected]:$ 

所以我改变了作为建议shell脚本

#!/bin/bash 
source ~/.virtualenvs/pinax-env/bin/activate 

和使用

$ bash virtualenv_activate.sh 
[email protected]:$ 

运行该脚本。

这不会引发错误,但同样没有激活的虚拟ENV

那么如何解决这个问题的任何建议?

PS:我使用Ubuntu 11.04

+1

尝试'bash virtualenv_activate.sh' – arunkumar

+1

可否请您详细说明并将其作为答案发布。 – Gautam

回答

39

SH是不一样的bash(尽管有些系统只是链接SH打坏,因此运行SH实际运行的bash)。你可以把sh看作是bash的淡化版本。有一件事bash有这个sh不是“源”命令。这就是为什么你会得到这个错误......源码在你的bash shell中运行良好。但是,当您使用sh启动脚本时,可以在子进程中的shell中运行脚本。由于该脚本在sh中运行,因此找不到“源”。

解决方法是在bash中运行脚本。更改第一行...

#!/bin/bash 

然后用运行...

./virtualenv_activate.sh 

......或者......

/bin/bash virtualenv_activate.sh 

编辑:

如果你想激活virtualenv来改变你调用脚本的shell,你需要使用“源”或“点运算符”。这确保了脚本在当前shell中运行(并因此改变了当前环境)...

source virtualenv_activate.sh 

......或者......

. virtualenv_activate.sh 

作为一个方面说明,这是为什么virtualenv总是说你需要使用“源代码”来运行它的激活脚本。  

+1

或使用相当于来源的承载壳体,即'。 envFile',通常被称为'点envFile'。祝你好运;-) – shellter

+1

谢谢,但似乎并没有解决问题,当我使用bash它不会引发错误,但它也不激活virtualenv。您能详细解释.envFile – Gautam

+5

当您按照我所示的方式运行这些脚本时,它实际上会创建一个NEW shell,并在该shell中运行脚本。由于“源代码”脚本的整个要点是要更改当前的shell,因此这样做会失败。使用“source virtualenv_activate.sh”或“。virtualenv_activate.sh”运行脚本(请注意第一段时间之后的空间)。 –

3

source是bash中的内置shell命令,在sh中不可用。如果我没有记错,那么虚拟env会执行很多路径和环境变量操作。即使运行它作为bash virtualenv_blah.sh不会工作,因为这将只是在子shell内创建环境。

尝试. virtualenv_activate.shsource virtualenv_activate.sh这基本上会让脚本在您当前的环境中运行,并且所有由virtualenv激活修改的环境变量都将可用。

HTH。

编辑:这是一个链接,可以帮助 - 您的建议似乎不工作http://ss64.com/bash/period.html

4

在Mac OS X上。

我已经这样做了。我'不太满意的解决方案,但无论如何,在这里分享和希望,也许有人会提出一个更好的:

activate.sh

echo 'source /Users/andi/.virtualenvs/data_science/bin/activate' 

我通过给执行权限:chmod +x activate.sh

我执行这种方式:

`./activate.sh` 

注意到有以ASCII码96 =`形式是paranthesis(GRAV e口音)