`pip install package --save-dev` 的等效命令是什么?

320
在nodejs中,我可以使用npm install package --save-dev将安装的包保存到包中。
在Python软件包管理器pip中,如何实现相同的功能呢?我想在安装软件包后,将软件包名称及其版本保存到requirements.pip文件中,类似于使用pip install package --save-dev requirements.pip

6
将当前Python环境中安装的所有包及其版本信息输出到一个名为"requirements.pip"的文本文件中。 - falsetru
12
这不一样。 npm install package --save-dev 同时完成了安装和添加到 node_npm 要求文件的操作,更加方便。而使用 pip freeze 需要两个命令来完成相同的操作:1)pip install package 2)pip freeze > requirements.pip - hllau
2
Pip关于--save选项存在问题 - rutsky
如果使用setup.py来满足依赖需求,我已经创建了一个小模块(https://github.com/AdamGold/pypkgfreeze),可以将您的包版本冻结到setup.py中。 - AdamGold
您可以创建一个环境并安装生产依赖项,然后克隆它以创建开发环境,并安装开发依赖项。但是您必须手动同步它们。或者全局安装开发依赖项。它不能在开发人员之间共享,但它会很有用。Node.js 在这种情况下做得更好。 - 27px
9个回答

239

使用 pip 没有相应的功能。

最好的方法是使用 pip install package && pip freeze > requirements.txt

您可以在他们的文档页面上查看所有可用选项。

如果这真的困扰了您,编写一个自定义 bash 脚本 (pips) 并带有 -s 参数,可以自动将冻结结果保存到您的 requirements.txt 文件中。

编辑 1

自从写下这篇文章以来,没有提供类似于 NPM 的自动 --save-dev 选项,但 Kenneth Reitz(requests 等许多软件的作者)发布了一些关于更好地处理 pip 更新的更好的 pip 工作流程的信息。

编辑 2

从上面的“更好的 pip 工作流程”文章链接中,现在建议使用 pipenv 来管理要求和虚拟环境。最近我经常使用它,我想总结一下转换的简单性:

安装 pipenv(在 Mac 上)

brew install pipenv

pipenv 创建并管理其自己的虚拟环境。在具有现有 requirements.txt 的项目中,安装所有要求(我使用 Python3.7,但如果您不需要,可以删除 --three)非常简单:

pipenv --three install

激活虚拟环境以运行命令也很容易

pipenv shell

安装依赖将自动更新 PipfilePipfile.lock

pipenv install <package>

也可以更新过时的软件包

pipenv update

我强烈推荐查看此网站,特别是对于那些有 npm 背景的人来说,因为它与 package.jsonpackage-lock.json 有相似的感觉。


39
请注意,这也会保存依赖项的依赖项,随着时间的推移,这些依赖项可能不再需要,因为依赖关系已经停止使用它。 - Patrick Bassut
3
这似乎没有涉及原始问题中关于--save-dev方面的内容,该选项允许您在本地开发与生产环境下具有不同的依赖项。如何使用pipenv实现这一点? - jeznag
3
pipenv 允许你在 Pipfile 中指定 dev-packages,并且可以从命令行使用 --dev(或 -d)。例如:pipenv install --dev nose2 - Ewan

87

这条简单的命令是一个起点。你可以轻松地构建一个bash命令,以便在该行中重复使用PACKAGE。

pip install PACKAGE && pip freeze | grep PACKAGE >> requirements.txt

感谢 @devsnd 提供的简单Bash函数示例:

function pip-install-save { 
    pip install $1 && pip freeze | grep $1 >> requirements.txt
}

使用它,只需运行:

pip-install-save some-package

1
我的建议是:P=Flask pip install $P && pip freeze | grep $P >> requirements.txt - GBrian
软件包版本呢? - Anis LOUNIS aka AnixPasBesoin
pip freeze 命令可以检索软件包的版本。 - Karim N Gorjux
我发现这个答案非常有帮助。我在Windows环境下,所以这里是一个Powershell版本的bash函数:pip install $package; pip freeze | select-string $package -Raw >> $requirementsFile - Rob H

9
我创建了一个Python包,它包装了实际的pip,名为pipm。所有pip命令都将像原样工作,并且会反映在要求文件中。与pip-save(已停用一段时间)不同,这是我发现但无法使用的类似工具,它可以处理许多文件和环境(测试、开发、生产等)。它还有一个命令来升级所有/任何依赖项。

安装

pipm install pkg-name

安装为开发依赖项

pipm install pkg-name --dev

安装为测试依赖项

pipm install pkg-name --test

卸载

pipm uninstall pkg-name

更新所有依赖项

pipm update

从要求文件安装所有依赖项

pipm install

包括开发依赖项

pipm install --dev


实际上,非常有趣的开发! - artu-hnrq

4
更新: 显然,pipenv没有得到Python维护者的官方认可,而之前链接的页面是由另一个组织拥有的。该工具有其优点和缺点,但以下解决方案仍然实现了OP所寻求的结果。

pipenv是一个依赖管理工具,包装了pip,并提供了您所要求的内容。

https://pipenv.kennethreitz.org/en/latest/#example-pipenv-workflow

$ pipenv install <package>

这将创建一个Pipfile文件,如果不存在的话。如果已存在,则会自动使用您提供的新软件包进行编辑。

Pipfilepackage.json的直接等价物,而Pipfile.lock对应于package-lock.json


3

我正在使用这个小命令行来安装一个软件包并将其版本保存在 requirements.txt 中:

pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt

注意,这个命令行会将软件包的版本信息添加到 requirements.txt 文件中。


3
如何创建一个shell函数来实现这个功能? 将以下代码添加到您的~/.profile~/.bashrc文件中。
pips() {
    local pkg=$1

    if [ -z "$1" ]; then
        echo "usage: pips <pkg name>"
        return 1
    fi

    local _ins="pip install $pkg"
    eval $_ins
    pip freeze | grep $pkg -i >> requirements.txt
}

然后运行source ~/.profilesource ~/.bashrc将其导入到您当前的终端。

当您想要安装并保存一个软件包时,只需运行pips requests,例如。 在软件包被安装后,它的版本将保存在当前目录下的requirements.txt中。


3
您可以在Makefile中手动保存它(或将其保存为文本文件,然后导入到您的Makefile中)。
PYTHON=.venv/bin/python # path to pyphon
PIP=.venv/bin/pip # path to pip
SOURCE_VENV=. .venv/bin/activate


install:
    virtualenv .venv
    $(SOURCE_VENV) && $(PIP) install -e PACKAGE
    $(SOURCE_VENV) && $(PIP) install -r requirements.txt # other required packages

然后只需运行make install命令即可。


我完全同意这种方法。 - eleijonmarck

2

0

这个怎么样?

pip freeze >> requirements.txt

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