首页 > 解决方案 > 当从 bash 脚本调用时,pip 在 vi​​rtualenv 和全局安装包

问题描述

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

脚本.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(在 env 或全局中)它会删除 virtualenv 和全局中的包。
如果我再次运行脚本并列出“站点包”中的内容,ls venv/lib/python3.7/site-packages则安装的包不存在,所以我的“venv/bin/pip”以某种方式指向我的全局“站点包”?

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

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

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

标签: pythonbashpip

解决方案


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

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

如果你用source script.shthis 调用它,它将在你当前的 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"删除。

或者,我认为您所追求的是一个子shell,它在里面运行所有东西,这在上面的链接中。


推荐阅读