繁体   English   中英

当从bash脚本调用时,pip在virtualenv和全局安装包

[英]pip installs packages in virtualenv and globally when called from bash script

我正在尝试激活python环境并使用pash在bash文件中安装一些软件包。 它成功安装在环境中,但也在我的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 pip freeze | xargs pip uninstall -y (在env或global中)它会删除virtualenv和global中的包。
如果我再次运行脚本并在'site-packages'中ls venv/lib/python3.7/site-packages内容,那么安装的软件包就不存在了,所以我的'venv / bin / pip'以某种方式指向我全球'网站包'?

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

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

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

在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"

或者,我认为你所追求的是一个子shell,运行里面的所有内容,这在上面的链接中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM