如何在不创建 virtualenv 的情况下 pip 安装用 Pipfile 编写的包?

How to pip install packages written in Pipfile without creating virtualenv?

我创建了一个包含 Pipfile 的包,我想用 docker 进行测试。

我想用 pip 安装用 Pipfile 编写的包,而不创建 virutalenv。

# (do something to create some-file)
RUN pip install (some-file)

怎么办?

最终 pip 应该能够自己做到这一点,至少他们是这么说的。目前,尚未实施。

目前,Pipfile 是一个 TOML 文件,因此您可以使用 TOML 解析器提取包约束并以 pip 可识别的格式发出它们。例如,如果您的 Pipfile 仅包含简单的字符串版本说明符,这个小脚本将写出一个 requirements.txt 文件,然后您可以将其传递给 pip install -r:

import sys
import toml

with open(sys.argv[1]) as f:
    result = toml.load(f)
for package, constraint in result['packages'].items():
    if constraint == '*':
        print(package)
    else:
        print(f'{package} {constraint}')

如果您的 Pipfile 包含更复杂的结构,您必须编辑此代码以解决这些问题。


您可能会考虑的一种适合 Docker 容器的替代方法是使用 pipenv 将软件包安装到系统 Python 安装中,然后删除生成的之后的虚拟环境。

pipenv install --system
pipenv --rm

但是,严格来说,如果不创建 virtualenv,这并不能实现您声明的目标。

其他答案之一让我想到了这个,但我想明确指出它,以及为什么它是一个有用的解决方案。

Pipenv 很有用,因为它可以帮助您创建虚拟环境。这在您的本地开发机器上非常有用,因为您通常会有很多项目,具有不同的依赖关系等。

在 CICD 中,您将使用通常只启动几分钟来完成部分 CICD 管道的容器。由于每次 运行 管道时都会启动一个新容器,因此无需在容器中创建虚拟环境来使事情井井有条。您可以简单地将所有依赖项直接安装到 python 的主要 OS 版本。

为此,运行 在您的 CICD 管道中执行以下命令:

pipenv install --system