从特定提交安装Pip提示“要求已满足”
我正在使用 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 个回答
如果你有一些依赖项需要固定在特定版本上,那么你应该在你的需求文件中将它们锁定到那个版本。比如说(虽然这不太现实):
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=
的信息
如果你想用 pip 检出某个包并且编辑那个包的代码,#egg=mypackage
这一部分是必须的,但你需要使用:
-e git+ssh://...#egg=mypackage
然后 pip
会在你的虚拟环境的主目录下的 src
目录中创建一个以那个名字命名的文件夹(使用 cdvirtualenv
可以找到它),至少在我的系统上是这样,并且会使用 git clone
检出代码(如果使用 Mercurial 或 SVN 也会相应处理),这样你就可以直接在里面编辑代码。
但是如果你没有指定 -e
(就像你之前做的那样),那么我认为它会把代码当作普通包检出,这样如果你想在原地编辑就会比较麻烦,而且你就不需要 #egg=
这一部分了。
毫无疑问,还有很多配置选项……一个好的起点就是我链接的那个文档。
你看到 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
是个好主意,因为这样可以明确项目名称。