我正在尝试激活 python 环境并在 bash 文件中使用 pip 安装一些包。它在环境中安装成功,但也在我的 mac 上全局安装,我不明白为什么。
脚本.sh:
#!/bin/bash
source '<absolute path>/venv/bin/activate'
which pip
pip install psutil
pip list
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./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
Run Code Online (Sandbox Code Playgroud)
但是,在另一个没有虚拟环境的终端中,它也会被安装:
$ 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
Run Code Online (Sandbox Code Playgroud)
如果我在终端中一一键入脚本中的命令,它会按预期工作。
我缺少什么?
编辑:
如果我运行pip freeze | xargs pip uninstall -y(在环境中或全局中),它将删除 virtualenv 和全局中的包。
如果我再次运行脚本并列出“site-packages”中的内容,ls venv/lib/python3.7/site-packages则安装的包不存在,所以我的“venv/bin/pip”以某种方式指向我的全局“site-packages”?
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。运行source <path>/bin/activate在您当前的 shell 中运行它,因此它可以从命令行运行。您的 bash 脚本如下所示:
#!/bin/bash
source "<absolute path>/venv/bin/activate"
which pip
pip install psutil
pip listenter code here
Run Code Online (Sandbox Code Playgroud)
如果你使用 this 调用它,source script.sh它将在你当前的 shell 中运行它并且应该按预期工作。希望这可以帮助。这里还有一些其他方法:
/sf/answers/918555361/
virtualenvs 的示例方法:
python -m venv venv_test或virtualenv venv_testsource ./venv_test/bin/activate在命令行上)./script.sh,已source "<absolute path>/venv/bin/activate"删除。或者,我认为您需要的是一个子 shell,运行内部的所有内容,位于上面的链接中。