2012-10-29 153 views
51

如何创建Bash脚本来激活Python virtualenv?如何在Bash脚本中激活virtualenv激活

我有一个目录结构,如:

.env 
    bin 
     activate 
     ...other virtualenv files... 
src 
    shell.sh 
    ...my code... 

我可以通过激活我的virtualenv:

[email protected]:src$ . ../.env/bin/activate 
(.env)[email protected]:src$ 

然而,从bash脚本做同样的无助:

[email protected]:src$ cat shell.sh 
#!/bin/bash 
. ../.env/bin/activate 
[email protected]:src$ ./shell.sh 
[email protected]:src$ 

我在做什么错?

+0

这个问题看起来类似:http://stackoverflow.com/questions/192292/bash-how-best-to-include-other-scripts。检查那里给出的解决方案是否有助于你的情况。 –

+4

当你运行一个shell脚本时,你实际上正在创建一个新的shell。使用'source'的要点是改变当前shell的内容。你可以使用完整路径'。/ env/bin/python'来使用virtualenv的python。 –

+0

@NgureNyaga,不,那个问题跟我的不一样。他们问如何从任意位置获取信息。我已经知道如何做到这一点。我在问如何在自定义bash脚本中进行源代码并维护源代码。 – Cerin

回答

41

当您来源时,您正在将激活脚本加载到活动shell中。

当您在脚本中执行此操作时,会将其加载到该脚本中,当脚本结束并退回原始未激活的shell时退出该脚本。

你最好的办法是做一个函数

activate() { 
    . ../.env/bin/activate 
} 

或别名

alias activate=". ../.env/bin/activate" 

希望这有助于。

+0

for windows c:\ tutorial>。\ env \ Scripts \ activate – max4ever

+2

我完全不知道这是我在做源代码时发生了什么 这大大地改变了我的bash脚本。谢谢! –

+0

你的别名想法也适合我。请注意:我必须在我的.zshrc脚本(或bash用户的.bashrc)中放置它(别名abcdef =“source .../bin/activate”)才能使用。 – shahins

6

Sourcing在当前shell中运行shell命令。当您在脚本内部进行上述操作时,您正在影响该脚本的环境,但是当脚本退出时,环境更改将被撤消,因为它们实际上已超出范围。

如果您的目的是在virtualenv中运行shell命令,那么可以在获取激活脚本后在脚本中执行该命令。如果您的意图是与virtualenv中的shell进行交互,那么您可以在脚本内产生一个可以继承环境的子shell。

-1

寻找bash脚本是为了什么?

  1. 如果您打算在多个virtualenvs之间进行切换或迅速进入一个virtualenv中,你尝试过virtualenvwrapper?它提供了很多使用例如workon venv,mkvirtualenv venv等等。

  2. 如果您只是在特定的virtualenv中运行python脚本,请使用/path/to/venv/bin/python script.py来运行它。

12

尽管它不会在shell提示符中添加“(.env)”前缀,但我发现这个脚本按预期工作。

#!/bin/bash 
script_dir=`dirname $0` 
cd $script_dir 
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i" 

例如

[email protected]:~/src$ which pip 
/usr/local/bin/pip 
[email protected]:~/src$ which python 
/usr/bin/python 
[email protected]:~/src$ ./shell 
[email protected]:~/src$ which pip 
~/.env/bin/pip 
[email protected]:~/src$ which python 
~/.env/bin/python 
[email protected]:~/src$ exit 
exit 
+3

在技术上你正在产生一个子壳。这不一定是个问题,但你应该为OP做好准备。 – richo

+13

Cerin *是* OP ;-) – zigg

+0

哦..我应该先阅读更多内容。我的错! – richo

18

您应该使用源代码调用bash脚本。

下面是一个例子:

#!/bin/bash 
# Let's call this script venv.sh 
source "<absolute_path_recommended_here>/.env/bin/activate" 

在你的shell只是把它这样的:

> source venv.sh 

或者为@outmind建议:(请注意,这不符合zsh的工作)

> . venv.sh 

你走了,壳指示将被放置在你的提示。

+1

或甚至只是 “venv.sh” – outmind

+1

。在zsh上不起作用,请使用source。 – 3manuek

+0

无论我尝试什么,这个'source“/ home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate”'产生:'/home/surest/Desktop/testservers/TEST_VENV/py3.sh:10:/ home/surest/Desktop/testservers/TEST_VENV/py3.sh:source:not found' –