[英]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的示例方法:
python -m venv venv_test
或virtualenv venv_test
source ./venv_test/bin/activate
(在cmd行上) ./script.sh
,删除source "<absolute path>/venv/bin/activate"
。 或者,我认为你所追求的是一个子shell,运行里面的所有内容,这在上面的链接中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.