【问题标题】:`python -m venv foo` does not install pip inside the nested environment`python -m venv foo` 不在嵌套环境中安装 pip
【发布时间】:2019-11-18 11:46:29
【问题描述】:

我的项目需要 python3.7,它不能作为 ubuntu 包提供,所以我使用 conda 引导了一个 python3.7 环境。从那个“祖父”环境中,我为特定项目创建了一个“父”python3 虚拟环境。

在我的项目的父环境中,我正在运行来自 google-cloud-sdk 的命令行工具,该工具创建了另一个测试环境。该脚本通过调用与(parent) $ python3 -m venv /tmp/grandchild 等效的东西来创建一个“孙子”环境。

由于某种原因,那个孙子环境没有安装 pip 二进制文件。这就是问题所在。这个缺失的 pip 会导致 google 脚本无法安装 dev-test 依赖项。然而,父母和孩子确实安装了 pip,但 pip 没有被传递下去。

当我将 conda 排除在外,并且只依赖于我的 ubuntu 软件包系统(在 /usr/lib 下)附带的 python 时,我可以将我的虚拟环境嵌套得令人作呕,并且 pip 似乎总是被正确继承.我认为这是我遇到的 python/pip conda 环境特有的东西。

我认为这是一个单独的原因问题:pip missing from Python venv (我的盒子上没有那个文件 ~/.pydistutils.cfg)

更新

我找到了一种方法来可靠地重现这一点,并且不需要 conda。当使用 virtualenv 创建父级时会发生这种情况,即virtualenv parent,而子级是使用-m venv 从该父级创建的,即(parent) $ python3 -m venv child。然后,孩子不会将 pip 复制到其中。

使用virtualenv 创建的嵌套环境运行良好,使用venv 创建的嵌套环境也运行良好,但在virtualenv 创建的环境中使用venv 时就不行了。它们不会混合。

注意:环境本身并不是真正的“嵌套”,它们是独立的副本。我的意思是一个是从另一个创建的。

【问题讨论】:

  • 这和 conda 有什么关系? Conda 和 venv 是两个独立的解决方案。如果你想要一个 conda 环境,请使用 conda。如果你想要一个 venv,请使用 venv。
  • 我可以看出这是多么具有误导性。我最初使用 conda 创建了一个 python3.7 环境(在我的 ubuntu 版本中默认不提供 3.7)。从那个名为“python3 -m venv my_project”的 conda python 3.7 环境中创建一个项目虚拟环境。该项目 virtualenv 的行为与使用我的 ubuntu 的默认 python 创建的项目不同,即创建的环境 from 它被破坏了。 conda 的事情可能是一个红鲱鱼。很可能不是 conda 本身的错误,但无论如何创建环境的方式有所不同。
  • 我的建议是不要这样做。只需创建一个 conda 环境。 Conda 和 venv 不能混合在一起。
  • 这并不理想,同意。我添加了更多详细信息,为什么需要 pip。经过一些测试后,我可以报告这与 conda 无关(我从列表中取出了标签)。它与从使用 python-virtualenv 创建的环境中调用 python3 -m venv 有更多关系。

标签: python-3.x python-venv


【解决方案1】:

一种解决方法是使用相同的方法创建所有环境。

例如对链上的所有环境使用python3 -m venv

  1. python3 -m venv parent; source parent/bin/activate
  2. (parent) $ python3 -m venv child

如果这似乎让您陷入符号链接网络,您还可以提供--copies 标志:python3 -m venv --copies …,这可以避免这种情况。

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 2020-01-12
    • 2019-01-14
    • 2021-08-13
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多