我正在尝试激活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.,它将按预期工作。
答案 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的示例方法:
python -m venv venv_test
或virtualenv venv_test
source ./venv_test/bin/activate
(在cmd行上)./script.sh
,该脚本已删除source "<absolute path>/venv/bin/activate"
。或者,我认为您所需要的是一个子外壳,该外壳运行着上面链接中的所有内容。