PIP:仅安装依赖项

46

我有一个脚本用于创建 virtualenv,并在其中安装 distributepip,然后选择性的克隆一个 git 仓库。

现在我已经安装了将要使用的项目。但是它的依赖项没有安装。如何让 pip 安装所有的依赖项,就像我已经发出了 pip install MyApp 的命令一样?

编辑:显然我的问题是一个重复的问题,可以参考 这个

不太确定,但是 pip install -e . 似乎能够满足我的需求,而且不会留下太多额外的东西。虽然我希望我的代码不与 site-packages 相关联。


3
我有一个脚本,可以创建一个虚拟环境,并在其中安装distribute和pip。但是你知道吗?使用pip -E VENV_DIR pip命令即可完成这三件事情,因为默认情况下,pip会在新创建的环境中安装pip和distribute。 - Piotr Dobrogost
酷的提示!不过我不再使用提到的脚本了。 - muhuk
如果您想使用setup.py仅安装依赖项,则可以参考以下链接:https://dev59.com/1F0a5IYBdhLWcg3wCEsw - Charlie Parker
请查看我在此处的答案:https://dev59.com/1F0a5IYBdhLWcg3wCEsw#73376882 - Charlie Parker
运行以下命令:python setup.py egg_info; pip install -r *.egg-info/requires.txt; rm -rf *.egg-info/ - Charlie Parker
5个回答

28

如果你的依赖项是在 setup.py 文件中定义的,你可以先使用以下命令将其导出到一个外部文件中:

python setup.py egg_info

这将列出您所有依赖项在 YOUR_PROJECT.egg-info/requires.txt 文件中。然后,您可以使用 pip 安装它们:

pip install -r *.egg-info/requires.txt

删除您刚刚创建的内容:

rm -rf *.egg-info/

为了节省一些时间,可以复制粘贴:

python setup.py egg_info
pip install -r *.egg-info/requires.txt
rm -rf *.egg-info/

7
如果你有额外的依赖项(extra_require),那么这将无法工作,因为 requires.txt 文件中将包含 [dev]。 - Daniel Pinyol
如果你的 setup.py 文件中有 extras_require,在调用 pip install -r 之前,你可以使用 sed 命令删除额外的行。 - Pete Baughman
有没有办法跳过将它们转储到外部文件中?也许你还应该告诉我们如何删除第一个命令所做的所有额外文件等,即 python setup.py egg_info - Charlie Parker
在通配符上加上+1,使pip install适用于所有人。只缺少我想要自己运行的rm -rf *.egg-info/以删除依赖文件。顺便说一下,我的答案是从这里启发的:https://dev59.com/1F0a5IYBdhLWcg3wCEsw#73376882 - Charlie Parker
@jan-glx 然后创建一个包装器 setup.py,只需使用 from setuptools import setup setup() 命令并运行。确保你的 setuptoolspip 已经更新。 - KamilCuk
显示剩余2条评论

9
在我的项目根目录下运行pip install -e .,安装依赖项。

24
副作用相当严重。-e 以可编辑模式安装,这意味着包会从站点包链接而不是复制。我预计这种方法在您试图真正安装该软件包时会引起奇怪和微妙的问题,特别是如果您没有先运行 pip uninstall 的话。 - Silas Ray
1
请注意,这种方法会尝试以某种方式安装软件包本身。请参阅 https://github.com/pypa/pip/issues/7218 了解一个示例,其中此操作会产生不良影响。 - bli
5
这显然不是正确的答案!为什么会被接受?这将做更多的事情,而不仅仅是“安装依赖项”。 - Charlie Parker
1
@maciek 自 pip v21.3 开始,当仅使用 pyproject.toml 时,可编辑安装,请参见:https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/#editable-installation - jan-glx
@CharlieParker 虽然它没有回答问题,但它解决了 OP 的问题。 - jan-glx

5

为安装项目的依赖项(即install_requires+ extra_requires),您需要使用setuptools egg-info来提取依赖项,然后安装过滤后的合并依赖项列表:

python setup.py egg_info
pip install `grep -v '^\[' *.egg-info/requires.txt`

4

您可以使用pip-tools来创建一个requirements.txt文件,它仅包含您的软件包所需的依赖项:

$ pip-compile -o requirements.txt setup.py

请注意,上述命令仅在您没有requirements.txt文件时才有效。如果您已经有了这个文件,请将其删除。
使用生成的requirements.txt文件,您可以运行pip来安装依赖项:
$ pip install -r requirements.txt

奖励1:

requirements.txt将包含注释,指示相关依赖项的来源。

奖励2:

如果您在setup.py中有一个可选依赖项的extras_require部分,看起来像这样:

    ...
    extras_require={
        "development": [
            "wheel",
            "debugpy",
            "pytest",
        ],
    },
    ...

您可以使用以下命令创建包括可选依赖项的 requirements.txt

$ pip-compile -o requirements.txt --extra development setup.py

1

你应该使用pip requirements文件。

基本上,将所有的要求放在一个文件中,每行一个,并使用命令将其传递给pip

pip install -r requirements.txt

此外,如果您有一个标准环境,pip实际上可以使用以下命令从现有安装中转储这样的文件:
pip freeze

你可以直接将生成的文件放入pip要求中,并在部署脚本中调用前面的命令。

很酷,不是吗? :)


18
很酷,但它并没有回答我的问题。我不是在寻找定义依赖关系的方法。仔细阅读问题有助于提供正确的答案。 - muhuk
9
等等,你可以把所有的依赖放在一个文件中,然后让pip为你安装它们。这不是你想要的吗?如果不是,我可能没有正确理解你的问题。即使现在也是如此。 - lprsd
2
区别在于您指定“myrepo==1.0.1”或其他内容的 requirements.txt 或您要安装的 myrepo 包的 setup.py 中指定依赖项。如果您已经掌握了仓库,则仅安装依赖项可能是有意义的。 - andy
3
这个问题是在寻找一种安装正在开发的软件包所依赖项的方法。它的依赖关系将在软件包的 setup.py 文件中声明。它甚至可以有条件依赖关系(例如基于操作系统)。我认为 requirements.txt 无法处理这个问题,即使它可以,你也需要额外的工作将要求从文件加载到 setup.py 中。 - jpmc26
2
这不太对,因为setup.pyrequirements.txt的用途不同,它们的角色不可互换。请参阅Python打包文档:https://packaging.python.org/discussions/install-requires-vs-requirements/#requirements-files - xuhdev
显示剩余2条评论

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