我使用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)...
for 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
?#egg=mypackage
?答案 0 :(得分:4)
您获得Requirement already satisfied
的原因是,如果您未通过--upgrade
或-U
(简写),则不会修改软件包(如果已安装)。
(该部分命令已进行了批次讨论。查看前4个问题here)
有没有办法只使用requirements.txt文件升级特定包mypackage
?
在告诉升级时,您需要指定mypackage
pip。如果只想更新请求,则pip命令为:
pip install --upgrade requests
同样,要从您的git存储库进行更新,您需要执行以下操作:
pip install --upgrade git+ssh://git@github.com/myuser/mypackage.git#egg=mypackage
由于URL很长,我建议你做@daphtdazz建议的,使用多个需求文件,如下所示:
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
此外,我建议你为shell使用shell-aliases来减轻打字负担。
alias pip_git_upgrade="pip install --upgrade -r git_requirements.txt"
我是否需要指定#egg=mypackage
?
引用pip's official documentation:
任何URL都可以使用#egg = name语法显式声明项目名称。
基本上,使用#egg=mypackage
是个好主意,因为你明确了项目名称。
答案 1 :(得分:1)
如果您有需要在特定版本的依赖项,那么您应该在需求文件中修复它们以保持该版本。所以例如(虽然不现实):
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
另一种选择,如果你想要定期升级所有这些,但比其他更常规的是分割需求文件。见the pip docs。我怀疑这需要pip
和setuptools
的最新版本(但是你还要定期更新那些,对吗?)。
例如,您可以:
git+ssh://git@github.com/myuser/mypackage.git@733c5b616da27cba14478c24b#egg=mypackage
-r update_regularly_reqs.txt
mock~=2.0.0
pexpect==2.4.1
#egg=
如果您想使用pip检查它并且还编辑该包中的代码,则需要#egg=mypackage
位,但是您需要使用:
-e git+ssh://...#egg=mypackage
pip
然后会在您的virtualenv主目录的src
目录中创建一个目录(使用cdvirtualenv
查找它),或者至少它在我的系统上,将使用git clone
检查代码(或者如果使用Mercurial或SVN则适用于这些代码),以便您可以在适当的位置进行编辑。
但是,如果你没有指定-e
(正如你所做的那样),那么我认为它会将其作为普通包进行检查,如果你想要编辑它,你就很难管理它,然后你不需要#egg=
位。
毫无疑问,还有很多配置选项......一个好的起点就是我链接的文档。