Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pip install from a specific commit prompts "requirements already satisfied"

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://[email protected]/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://[email protected]/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?
like image 799
Leonardo Avatar asked May 19 '14 10:05

Leonardo


People also ask

How do I install pip packages from requirements txt?

Use the pip install -r requirements. txt command to install all of the Python modules and packages listed in your requirements. txt file.

How do I set pip to specify?

To install a specific version of a Python package you can use pip: pip install YourPackage==YourVersion . For example, if you want to install an older version of Pandas you can do as follows: pip install pandas==1.1. 3 .

Does pip install requirements in order?

Yup -- pip installs "bottom up" in the dependency tree -- installing the dependencies before dependent package, regardless of what is specified on the top level.

Does Python 3.8 5 have pip?

Does Python 3.8 have pip? The current version of pip works on: Windows, Linux and MacOS. CPython 3.7, 3.8, 3.9, 3.10 and latest PyPy3.


2 Answers

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://[email protected]/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://[email protected]/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.

like image 71
pradyunsg Avatar answered Sep 19 '22 08:09

pradyunsg


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://[email protected]/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://[email protected]/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://[email protected]/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.

like image 22
daphtdazz Avatar answered Sep 21 '22 08:09

daphtdazz