从特定提交安装Pip提示“要求已满足”

11 投票
2 回答
4533 浏览
提问于 2025-04-18 06:59

我正在使用 pip 和一个 requirements.txt 文件来管理我在虚拟环境中的 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

问题:

  • 有没有办法只升级特定的包 mypackage,可能通过 requirements.txt 文件?
  • 我需要指定 #egg=mypackage 吗?

2 个回答

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 的文档。我猜这需要一个最新版本的 pipsetuptools(但你应该也在定期更新它们,对吧??)。

例如,你可以有:

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= 的信息

如果你想用 pip 检出某个包并且编辑那个包的代码,#egg=mypackage 这一部分是必须的,但你需要使用:

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

然后 pip 会在你的虚拟环境的主目录下的 src 目录中创建一个以那个名字命名的文件夹(使用 cdvirtualenv 可以找到它),至少在我的系统上是这样,并且会使用 git clone 检出代码(如果使用 Mercurial 或 SVN 也会相应处理),这样你就可以直接在里面编辑代码。

但是如果你没有指定 -e(就像你之前做的那样),那么我认为它会把代码当作普通包检出,这样如果你想在原地编辑就会比较麻烦,而且你就不需要 #egg= 这一部分了。

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

10

你看到 Requirement already satisfied 的原因是,如果你不加 --upgrade 或者它的简写 -U,那么如果这个包已经安装了,就不会进行任何修改。

(这部分命令讨论得非常多。你可以在 这里查看前四个相关问题)


有没有办法只升级特定的包 mypackage,可能还要用到 requirements.txt 文件?

当你告诉 pip 要升级时,只需要指定 mypackage。如果你只想更新 requests,pip 命令是:

pip install --upgrade requests

同样,如果你想从你的 git 仓库更新,可以这样做:

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

因为这个 URL 很长,我建议你按照 @daphtdazz 的建议,使用多个 requirements 文件,具体如下:

requirements.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

另外,我建议你为你的命令行设置别名,这样可以减少输入的负担。

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

我需要指定 #egg=mypackage 吗?

引用一下 pip 的官方文档

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

总的来说,使用 #egg=mypackage 是个好主意,因为这样可以明确项目名称。

撰写回答