从pyenv-virtualenv切换到pipenv时如何保持相同的共享虚拟环境

7
我开始研究pipenv,它似乎相当不错。但我唯一的担心是我的大多数项目都涉及numpy、scipy和其他一些不太小的库。

我当前管理项目的方式:我安装了pyenv和pyenv-virtualenv,我有几个(目前4个)特定的虚拟环境,每个环境都适用于一个项目类型。项目本身设置了.pyenv-version,我启用了pyenv的自动加载虚拟环境功能。如果我需要共享项目,则从虚拟环境中生成requirements.txt文件。

因此,在我的当前设置中,我有X个项目和Y个虚拟环境,其中Y << X,总计占用了几个GB的硬盘空间。请注意,由于像numpy这样的大型库,每个虚拟环境都非常大,大约为700-900 MB。

我的问题:

据我所知,默认情况下,pipenv会为我的所有项目创建一个虚拟环境,因此我的虚拟环境占用的硬盘空间将大大增加。我感兴趣的是:

  • 是否可以在使用完全相同的依赖项的情况下跨多个项目共享pipenv环境?即加载相同的虚拟环境的多个pipenv配置文件?
  • 如果不行,是否可以从我使用pyenv设置的虚拟环境生成pipenv配置文件?即我不会使用pipenv运行我的项目,我也不会使用pipenv创建任何虚拟环境,但我将创建用于共享项目的pipenv配置文件(在这种情况下,可能还有一个requirements.txt文件)。
编辑: 我重写了大部分问题,以使其更清晰。
1个回答

7

pipenv不适用于您的特定工作流程,因为它是以项目为中心而不是环境为中心的。 pipenv将虚拟环境视为易变的,并保留自由更改它的权利,如果情况需要。 您可以使用它,但在环境发生更改的情况下,由于pipenv的更严格的审查,保持所有项目同步将会很困难。

您可以通过在项目根目录中创建一个带有路径的.venv文件(通常,虚拟环境会在特定位置创建,并包含路径哈希的自动生成名称)来明确指定pipenv用于项目的虚拟环境。这似乎没有记录。

然而,pipenvvirtualenv不同,它检查并强制执行虚拟环境具有满足Pipfile中条件的确切模块集和生成的Pipfile.lock中指定的确切“最后测试配置”。

此外,如果您从requirements.txt生成Pipfile,它将指定精确的软件包版本并包括所有依赖项--虽然按设计,它应该包含更智能的信息。 因此,如果您更改环境中的任何软件包版本,则需要:
  • 更新受影响项目中的所有Pipfile.lock(例如复制已更改的文件)。使用生成的Pipfile,您可以通过删除它们来解决。
  • 如果有更改,更新受影响项目中的所有Pipfile到新的软件包版本(例如复制已更改的文件)

我对问题进行了相当大的更新,希望现在更有意义了。 - fbence
@fbence 最终抽出时间深入源代码并找到了一个确定性的答案。请查看更新。 - ivan_pozdeev
太棒了,非常感谢您深入挖掘源代码!实际上,即使我必须承认,除非您拥有非常大的环境,否则这看起来并不难以管理 :) - fbence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接