【发布时间】: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有更多关系。