10

我正在使用pip一个requirements.txt文件来处理我的 virtualenv 中的 python 包。我有一个从 Github 安装的特定软件包,因此在我的文件中我有:

git+ssh://git@github.com/myuser/mypackage.git#egg=mypackage

由于我经常使用该软件包,因此我需要重新安装它,但是: pip install -r requirements.txt还给我

Requirement already satisfied (use --upgrade to upgrade)...

对于 requirements.txt 中具有新版本的所有包。

如果我运行pip install -r requirements.txt --upgrade它会尝试升级我所有的包(我想要的),但我只想升级mypackage。在 requirements.txt 我尝试添加一个特定的提交,如下所示:

git+ssh://git@github.com/myuser/mypackage.git@733c5b616da27cba14478c24b#egg=mypackage

但是当我再次运行 pip 时,它会抛出:

Requirement already satisfied (use --upgrade to upgrade)..bla bla bla

问题:

  • 有没有办法使用 requirements.txt 文件升级特定的包?mypackage
  • 我需要指定#egg=mypackage吗?
4

2 回答 2

9

你得到的原因Requirement already satisfied是因为如果你不通过--upgrade-U(速记),如果已经安装了包,则不会修改它。

(这部分命令已经有很多讨论了。在这里查看前 4 个问题)


mypackage有没有办法使用 requirements.txt 文件只升级特定的包?

mypackage在告诉它升级时,您需要指定只是pip。如果您只想更新请求,则 pip 命令是:

pip install --upgrade requests

同样,要从您的 git 存储库进行更新,您需要执行以下操作:

pip install --upgrade git+ssh://git@github.com/myuser/mypackage.git#egg=mypackage

由于它是一个 URL 是一个很长的东西,我建议你按照@daphtdazz 的建议做,使用多个需求文件,如下所示:

要求.txt

requests~=2.12.3
simplejson~=3.10.0
-r git_requirements.txt

git_requirements.txt

git+ssh://git@github.com/myuser/mypackage.git#egg=mypackage

此外,我建议您为您的 shell 使用 shell-aliases 以减轻打字负担。

alias pip_git_upgrade="pip install --upgrade -r git_requirements.txt"

我需要指定#egg=mypackage吗?

引用pip 的官方文档

任何 URL 都可以使用 #egg=name 语法来明确声明项目名称。

基本上,使用#egg=mypackage是一个好主意,因为您要明确项目名称。

于 2016-12-07T07:50:41.327 回答
2

如果您有依赖项需要处于特定版本,那么您应该在您的需求文件中修复它们以保持该版本。例如(虽然不现实):

mock~=2.0.0
pexpect==2.4.1
git+ssh://git@github.com/myuser/mypackage.git@733c5b616da27cba14478c24b#egg=mypackage
  • mock将更新到任何看起来像 2.0.* 的版本(通常最小的更改是错误修复,所以你通常想要这个)
  • pexpect将固定在 2.4.1
  • mypackage将始终尽可能更新。

如果您只想升级一个包,那么只需升级那个:

pip install -U git+ssh://git@github.com/myuser/mypackage.git

如果您想定期升级所有这些但比其他更频繁的另一种选择是拆分需求文件。请参阅pip 文档pip我怀疑这需要和的最新版本setuptools(但无论如何你都会定期更新,对吧??)。

例如,您可以拥有:

update_regularly_reqs.txt

git+ssh://git@github.com/myuser/mypackage.git@733c5b616da27cba14478c24b#egg=mypackage

all_requirements.txt

-r update_regularly_reqs.txt
mock~=2.0.0
pexpect==2.4.1

编辑以添加信息#egg=

#egg=mypackage如果您想使用 pip 检查它并编辑该包中的代码,则需要该位,但是您需要使用:

-e git+ssh://...#egg=mypackage

pip然后将使用该名称src在您的 virtualenv 主目录(用于cdvirtualenv查找它)中的目录中创建一个目录,或者至少它在我的系统上创建一个目录,并将使用git clone(或适用于 Mercurial 或 SVN,如果使用这些)检查代码所以你可以去原地编辑它。

但是,如果您不指定-e(如您所做的那样),那么我认为它会将其作为普通包进行检查,如果您想就地编辑它,这会使您更难管理,然后您就不需要该#egg=位.

毫无疑问,也有很多配置选项......一个好的起点是我链接的那个文档。

于 2016-12-06T15:37:18.127 回答