如何在shell脚本中切换virtualenv?

时间:2019-04-04 09:48:17

标签: python-3.x shell virtualenv virtualenvwrapper

对于我的个人项目,我正在尝试分析各种python库的技术欠债。为此,我制作了python脚本,该脚本下载了库,签出到每个合并的提交并运行分析。分析的一部分是获得测试覆盖率。

我发现最简单的方法是运行

coverage run --source={library}/ setup.py test

但是,我想让它自动化,所以我试图在上述python脚本的shell脚本中运行此命令。

脚本应将目录更改为库,切换至virtualenv(在分析的前面步骤中自动创建)并运行coverage。但是,它在Requirement error上失败,这表明它实际上并未切换virtualenv并停留在分析项目的virtualenv中。

shell脚本如下:

#!/usr/bin/env bash

# Args
# $1 proj_path
# $2 proj_name
# $3 venv_name

cd $1
source `which virtualenvwrapper.sh`
workon $3
coverage run --source=$2/ setup.py test
coverage report

它是从python脚本中这样调用的:

subprocess.call(["analyzer/run_coverage.sh", self.repo_path, self.repo_name, self.venv_name])

您能帮我如何在Shell脚本中切换venv吗?谢谢!

1 个答案:

答案 0 :(得分:1)

脚本“激活”激活虚拟环境,而“停用”禁用虚拟环境:

https://virtualenv.pypa.io/en/stable/userguide/

在bash数组中存储的两个虚拟环境之间循环的示例:

venvs=(~/venvs/py3.6.4 ~/venvs/py3.7.0)
$ for i in "${venvs[@]}"
do
  source "$i"/bin/activate
  which python
  python --version
  deactivate
done
/home/gbajson/venvs/py3.6.4/bin/python
Python 3.6.4
/home/gbajson/venvs/py3.7.0/bin/python
Python 3.7.0