如何在Bash脚本中使用virtualenv激活

你如何创build一个Bash脚本来激活一个Python的virtualenv?

我有一个目录结构,如:

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

我可以激活我的virtualenv:

 user@localhost:src$ . ../.env/bin/activate (.env)user@localhost:src$ 

但是,从Bash脚本执行相同的操作却什么也不做:

 user@localhost:src$ cat shell.sh #!/bin/bash . ../.env/bin/activate user@localhost:src$ ./shell.sh user@localhost:src$ 

我究竟做错了什么?

当你来源时,你正在加载激活脚本到你的主动shell。

当你在一个脚本中执行它时,将它加载到该脚本完成时退出的shell中,然后返回到原始未激活的shell。

你最好的select是做一个函数

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

或别名

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

希望这可以帮助。

你应该使用源码来调用bash脚本。

这里是一个例子:

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

在你的shell中就像这样调用它:

 > source venv.sh 

或者@outmindbuild议:

 > . venv.sh 

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

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

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

例如

 user@localhost:~/src$ which pip /usr/local/bin/pip user@localhost:~/src$ which python /usr/bin/python user@localhost:~/src$ ./shell user@localhost:~/src$ which pip ~/.env/bin/pip user@localhost:~/src$ which python ~/.env/bin/python user@localhost:~/src$ exit exit 

Sourcing在您当前的shell中运行shell命令。 当你像上面这样做脚本的内部源代码时,你正在影响脚本的环境,但是当脚本退出时,环境变化就会被撤消,因为它们已经超出了范围。

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

什么是源代码的bash脚本?

  1. 如果您打算在多个virtualenvs之间切换或快速input一个virtualenv,您是否尝试过virtualenvwrapper ? 它提供了很多的workon venv ,如workon venvmkvirtualenv venv等等。

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