Pip install from a specific commit prompts “requirements already satisfied”

混江龙づ霸主 提交于 2020-08-19 06:42:06

问题


I'm using pip and a requirements.txt file to handle my python packages in my virtualenv. I have a particular package I install from Github so that inside my file I have:

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

Since I'm working on the package quite often I need to re-install it but: pip install -r requirements.txt gives me back

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

for all the packages in requirements.txt that have new versions.

If I run pip install -r requirements.txt --upgrade it tries to upgrade all my packages (that I do NOT want) but I want to upgrade only mypackage. In requirements.txt I've tried to add a specific commit, like so:

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

But when I run pip again it throws:

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

QUESTION:

  • Is there a way to upgrade only the specific package mypackage possibily using the requirements.txt file?
  • Do I need to specify the #egg=mypackage?

回答1:


The reason you're getting Requirement already satisfied is because if you do not pass --upgrade or -U (the shorthand), the package is not modified if it is already installed.

(This part of the command has had a lot of discussion. Check out the first 4 issues here)


Is there a way to upgrade only the specific package mypackage possibily using the requirements.txt file?

You need to specify just mypackage to pip when telling it to upgrade. If you wanted to update only requests, the pip command is:

pip install --upgrade requests

Similarly, to update from your git repository, you want to do:

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

Since it's a URL is a long thing, what I suggest you do what @daphtdazz suggests, use multiple requirements files, as follows:

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

Additionally, I suggest you use shell-aliases for your shell to ease the typing load.

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

Do I need to specify the #egg=mypackage?

To quote from pip's official documentation:

Any URL may use the #egg=name syntax to explicitly state the project name.

Basically, using #egg=mypackage is a good idea since you are making the the project name explicit.




回答2:


If you have dependencies that need to be at a particular version, then you should fix them in your requirements file to stay at that version. So for example (although not realistic):

mock~=2.0.0
pexpect==2.4.1
git+ssh://git@github.com/myuser/mypackage.git@733c5b616da27cba14478c24b#egg=mypackage
  • mock will be updated to any version that looks like 2.0.* (normally changes in the most minor number are bugfixes, so you generally want this)
  • pexpect will be fixed at 2.4.1
  • mypackage will always be updated whenever possible.

If you only want to upgrade a single package though, then just upgrade that one:

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

Another alternative if you want to upgrade all of them regularly but some more regularly than others would be to split up the requirements file. See the pip docs. I suspect this needs an up to date version of pip and setuptools (but you're updating those regularly anyway, right??).

For example, you could then have:

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

Edit to add info on #egg=

The #egg=mypackage bit is required if you want to check it out using pip and also edit the code in that package, but then you need to use:

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

pip will then make a directory in the src directory in your virtualenv's home directory (use cdvirtualenv to find it) with that name, or at least it did on my system, and will check out the code using git clone (or appropriate for Mercurial or SVN if using those) so you can go and edit it in place.

But if you don't specify -e (as you did) then I think it checks it out as a normal package, which makes it harder for you to manage if you want to edit it in place, and then you don't need the #egg= bit.

No doubt there are lots of config options too... a good place to start is that doc I linked.



来源:https://stackoverflow.com/questions/23736037/pip-install-from-a-specific-commit-prompts-requirements-already-satisfied

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!