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:
mypackage
possibily using the requirements.txt file?#egg=mypackage
?Use the pip install -r requirements. txt command to install all of the Python modules and packages listed in your requirements. txt file.
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 .
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 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.
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.
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.1mypackage
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:
git+ssh://[email protected]/myuser/mypackage.git@733c5b616da27cba14478c24b#egg=mypackage
-r update_regularly_reqs.txt
mock~=2.0.0
pexpect==2.4.1
#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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With