【问题标题】:Bash script to activate (source) python virtualenv using arguments使用参数激活(源)python virtualenv 的 Bash 脚本
【发布时间】:2019-11-14 23:21:32
【问题描述】:
我的主目录中有一个 python virtualenv 文件夹,其中有很多 python 虚拟环境,我想制作一个运行此命令的脚本:
$ source ~/Envs/env_that_i_specify_with_args/bin/activate.
使用 if else 可以,但我想要在 ~/Envs/ 目录中查找的内容,这样当我添加新环境时,我不必手动编辑脚本,但我可以使用参数来执行该命令另一个目录。(类似于$ activateEnv -1,在我的~/Envs/ directory, $ activateEnv -2 的第一个文件夹中运行该命令以在第二个文件夹中运行,等等)
- 关于如何做到这一点的任何想法?
- 由于我是 Linux 的新手,请以相当简单的方式解释它。
【问题讨论】:
标签:
python
bash
virtualenv
【解决方案1】:
您不能制作 bash 脚本来执行此操作。
原因很简单。
bash 脚本在子进程中执行,该子进程的 virtualenv 将被更改,然后 bash 脚本结束,您返回父进程并恢复与之前完全相同的环境。
换句话说:
子进程永远不能改变父进程的环境。
你可以做的是:
- 使用 bash 别名
- 使用 shell 函数
- 创建一个脚本,但用
source <script_name>“调用”它
例如,您可以将以下行添加到您的 ~/.bashrc 或您的 ~/.bash_aliases(如果它被 ~/.bashrc 调用)
setvenv() {
source /path/to/your/venv_base_dir/$1/bin.activate
}
如果你有例如以下 venvs
/path/to/your/venv_base_dir/venvone
/path/to/your/venv_base_dir/venvtwo
/path/to/your/venv_base_dir/venvthree
然后您只需输入setvenv venvthree 即可激活。
你问过激活第一个、第二个或第三个 venv 谁会是第一个?第一个按字母顺序?第一个按创建时间排序?
我认为使用目录的名称(venvone、venvtwo、venvthree)可能会更直观,尤其是如果您为您的 venvs 提供有意义的短名称。