从bash脚本调用时,pip在virtualenv中安装软件包,并在全局安装

时间:2019-06-18 08:54:42

标签: python bash pip

我正在尝试激活python环境,并在bash文件中使用pip安装一些软件包。它可以成功安装在环境中,但也可以全局安装在我的Mac上,我不明白为什么。

script.sh:

#!/bin/bash
source '<absolute path>/venv/bin/activate'
which pip
pip install psutil
pip list

输出:

$ ./script.sh
<absolute path>/venv/bin/pip
...
Package          Version  
---------------- ---------
pip              19.0.3   
psutil           5.6.3    
setuptools       41.0.1  
wheel            0.33.1   

但是,在没有虚拟环境的另一个终端中,它也会被安装:

$ which pip
/usr/local/opt/python/libexec/bin/pip
$ pip list
Package          Version  
---------------- ---------
pip              19.0.3   
psutil           5.6.3   
setuptools       41.0.1    
wheel            0.33.1   

如果我在终端中一一键入脚本中的命令,它将按预期工作。
我想念什么?

编辑:
如果我运行pip freeze | xargs pip uninstall -y(在环境或全局环境中),它将同时删除virtualenv和全局环境中的软件包。
如果再次运行脚本,并且在“站点软件包” ls venv/lib/python3.7/site-packages中列出内容,则安装的软件包不存在,那么我的“ venv / bin / pip”以某种方式指向我的全局“站点软件包”吗?

edit2: 我找到了重现行为的方法。
1.创建环境python -m venv venv_test
2.激活环境. venv_test/bin/activate
3.在script.sh
中编辑source '<absolute path>/venv_test/bin/activate' 4.运行脚本./script.sh

为什么这会使pip全局安装?

如果我跳过2.,它将按预期工作。

1 个答案:

答案 0 :(得分:3)

在bash脚本中运行此命令可在其他Shell中运行命令,然后将您返回到原始Shell。运行source <path>/bin/activate在当前shell中运行,因此可以从命令行运行。您的bash脚本如下所示:

#!/bin/bash
source "<absolute path>/venv/bin/activate"
which pip
pip install psutil
pip listenter code here

如果您使用source script.sh进行调用,它将在您当前的shell中运行它,并且应该可以正常工作。希望这可以帮助。这里还有一些其他方法: https://stackoverflow.com/a/13122219/7473057

virtualenvs的示例方法:

  1. 创建环境python -m venv venv_testvirtualenv venv_test
  2. 激活环境:source ./venv_test/bin/activate(在cmd行上)
  3. 运行脚本./script.sh,该脚本已删除source "<absolute path>/venv/bin/activate"

或者,我认为您所需要的是一个子外壳,该外壳运行着上面链接中的所有内容。