【问题标题】:/usr/bin/pip3 does not install package globally when in venv. How to do it?/usr/bin/pip3 在 venv 中不会全局安装包。怎么做?
【发布时间】:2021-12-15 07:14:40
【问题描述】:

创建并激活虚拟环境后:

python3 -m venv env
. ./env/bin/activate

全局 /usr/bin/pip3 不会全局安装包。实际上它确实复制了包文件但包没有完全安装:

 /usr/bin/pip3 install docker
Collecting docker
  Downloading docker-5.0.3-py2.py3-none-any.whl (146 kB)
     |████████████████████████████████| 146 kB 2.5 MB/s 
Requirement already satisfied: requests!=2.18.0,>=2.14.2 in /usr/lib/python3/dist-packages (from docker) (2.22.0)
Collecting websocket-client>=0.32.0
  Downloading websocket_client-1.2.1-py2.py3-none-any.whl (52 kB)
     |████████████████████████████████| 52 kB 2.9 MB/s 
Installing collected packages: websocket-client, docker
Successfully installed docker-5.0.3 websocket-client-1.2.1

文件被全局放置:

ls /usr/lib/python3.8/site-packages
docker  docker-5.0.3.dist-info  websocket  websocket_client-1.2.1.dist-info

但是没有 venv 活动的 shell 都不会认为 docker 已安装:

pip3 list|grep docker
python3
Python 3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'docker'
>>> 

venv 也没有看到已安装的 docker 包:


(env) pip3 list|grep docker
(env) python3
Python 3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'docker'
>>> 

这是一个错误吗?

如何在 venv 处于活动状态时使用 pip3 全局安装软件包?

我为什么要这样做?

Ansible 从 venv 启动,它以 localhost 为目标。因此,如果我只使用 pip3 作为可执行文件,它会使用来自 venv 的二进制文件。如果我使用 /usr/bin/pip3 我会得到上述行为。

这是一个更复杂的开源项目,我无法选择不从 venv 运行 Ansible 或不以 localhost 为目标。

谢谢

【问题讨论】:

    标签: python linux ansible python-venv


    【解决方案1】:

    我自己不使用 venv,但虚拟环境的全部意义在于将一组文件与系统的其余部分分开。

    如果你创建了一个虚拟环境并且在其中你不应该使用/usr/bin/pip3,你应该使用默认的pip3,因为这两个版本甚至可能不兼容。~

    这是一个更复杂的开源项目,我无法选择不从 venv 运行 Ansible

    您始终可以选择在虚拟环境中运行某些东西,可能会发生程序不尊重这一点并使用全局路径并忽略该虚拟环境,这是不应该发生的。

    来自 venv 文档:

    每个虚拟环境都有自己的 Python 二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可以在其站点目录中拥有自己独立的一组已安装 Python 包

    这意味着您应该创建虚拟环境,激活它,在其中安装您想要的任何东西,然后在该虚拟环境中运行所有东西。

    所以我不认为这是一个错误,只是您似乎没有按照预期使用它。如果您想在全局范围内安装某些东西,为什么首先要使用虚拟环境?

    【讨论】:

    • 我认为你没有抓住重点。我知道 venv 的用途。
    • 那你到底想做什么?
    猜你喜欢
    • 2017-07-03
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2014-05-30
    • 2023-04-03
    • 2012-06-14
    相关资源
    最近更新 更多