pip在不复制整个项目文件夹的情况下安装项目



当我在正在处理的项目上运行pip install .时,在pip开始安装过程之前,整个项目文件夹都会复制到一个临时文件夹中。对我来说,这是一个问题,因为我的项目文件夹中有几GB的数据,第二次无法放在我的磁盘上。因此,pip安装会填满我的磁盘,然后在可用空间用完时崩溃。

当我运行python setup.py install时,这不是问题,因为我清楚地定义了哪些文件夹应该是我的模块的一部分,当然所有的数据都不包括在内。此外,所有这些数据都被排除在.gitignore.dockerignore等等中。然而,pip并不关心这一点,正如文档所述:

在常规安装过程中,pip会将整个项目目录复制到一个临时位置并从那里安装。例外的是,pip将排除项目顶层中存在的.tox和.nox目录的复制。

如何防止pip复制我的整个项目文件夹,并使其尊重我精心编写的setup.py文件的内容?


背景:我曾经对setup.py install很满意,但最近我想尝试gitpre-commit,它在内部调用pip install .来构建项目。到目前为止,我还没有使用pip作为我的项目的构建工具,但我认为这可能是一个很好的机会,至少可以让我的项目与pip兼容,但到目前为止没有用。。。

这似乎是pip中一个长期存在的问题,至少从2014年开始就有讨论(见问题#2195(。

有一些建议可以解决这个问题,比如添加对像gitignore一样工作的pipignore文件的支持,但到目前为止,唯一实现的是添加一个硬编码规则来忽略.tox和.nox文件夹,这确实解决了这些工具的特定问题,但不是一般的问题。

一个解决方法是先创建一个源发行版(sdist(,然后pip安装该源包:

python setup.py sdist
pip install dist/<name>.tar.gz

当然,这并不能解决调用pip install .的第三方工具本身的问题。已经讨论过将其作为pip的默认行为,但由于我无法理解的原因,在过去6年中没有涉及到这一点,因此我预计在不久的将来不会解决这个问题。

最新更新