python - 当从 bash 脚本调用时,pip 在 virtualenv 和全局安装包
问题描述
我正在尝试激活 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. 它按预期工作。
解决方案
在 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.sh
this 调用它,它将在你当前的 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,它在里面运行所有东西,这在上面的链接中。
推荐阅读
- android - 无需身份验证即可获取特定应用的 Firestore 数据
- wordpress - 在 wordpress 中启用右侧类别
- database - Python:如何仅通过导入类文件(父到子)来调用另一个类方法(子)中的类方法(父)?
- android - 如何将点击事件传递给框架布局中的重叠视图
- javascript - 删除父级时如何删除子级?
- ios - 无法获取组的成员 (XMPP)
- android - Android内核编译中的UImage错误
- javascript - value === undefined vs typeof value === node.js中的'undefined'
- ios - 当我使用 swift 4 和 alamofire4 发布发布请求时,servlet request.parameter() 函数返回 null
- javascript - 为什么选择的选定值会在动态下拉列表中发生变化?