Is it possible to upgrade all Python packages at one time with pip
?
Note: that there is a feature request for this on the official issue tracker.
Is it possible to upgrade all Python packages at one time with pip
?
Note: that there is a feature request for this on the official issue tracker.
There isn't a built-in flag yet. Starting with pip version 22.3, the --outdated
and --format=freeze
have become mutually exclusive. Use Python, to parse the JSON output:
pip --disable-pip-version-check list --outdated --format=json | python -c "import json, sys; print('\n'.join([x['name'] for x in json.load(sys.stdin)]))" | xargs -n1 pip install -U
If you are using pip<22.3
you can use:
pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
For older versions of pip
:
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
The grep
is to skip editable ("-e") package definitions, as suggested by @jawache. (Yes, you could replace grep
+cut
with sed
or awk
or perl
or...).
The -n1
flag for xargs
prevents stopping everything if updating one package fails (thanks @andsens).
Note: there are infinite potential variations for this. I'm trying to keep this answer short and simple, but please do suggest variations in the comments!
pip install -U
, it will update all packages. I'm afraid it can cause some conflict with apt-get. –
Togetherness pip freeze --local | sed 's/==.*//' | xargs pip install -U
. –
Calomel tee
before doing the actual upgrade so that you can get a list of the original verisons. E.g. pip freeze --local | tee before_upgrade.txt | ...
That way it would be easier to revert if there's any problems. –
Azoth -n1
to xargs
, this makes it pass only one argument at a time to pip, otherwise pip quits on the first error. –
Robert pip list --outdated | grep -G '(Current.*)' | sed 's/ (Current.*//' | xargs -n 1 sudo pip install --upgrade
–
Biramous pip freeze --local | awk -F = '!/^-e/{print $1}' | xargs -n1 pip install -U
or 10 chars with sed pip freeze --local | sed '/^-e/d;s/=.*//' | xargs -n1 pip install -U
. –
Florineflorio -H
to sudo
to avoid an annoying error message: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
–
Antitank pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U --user
–
Xenos pip check
afterwards to check if any upgrades caused a dependency to no longer be satisfied for another package. –
Walther -P
to parallelize the updates? –
Haemolysin Permission denied
... Any way to prevent this operating on system packages? –
Undesirable --upgrade
on all packages , waste of time, we would upgrade the ones which are outdated right. –
Ewart xargs -r
to prevent running upgrade commands if nothing to upgrade! :) –
Morisco pip list --outdated --format=freeze
instead of pip freeze --local
is that the latter does not upgrade pip
itself if needed. –
Davies 'grep' is not recognized as an internal or external command, operable program or batch file.
–
Hurt pip 10
has added --exclude-editable
option. pip.pypa.io/en/stable/news/#id30 –
Sweetscented TypeError: '>' not supported between instances of 'Version' and 'Version'
–
Iggie pip list --outdated --format=freeze | grep -v "pip=="| grep -v '^\-e' | cut -d = -f 1 | grep -v pip | xargs -n1 pip install -U
. Of course if another package ends with "pip" then it won't get updated, either :) –
Digest ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts.
is there a way to upgrade to dependencies along with the actual module? –
Lengthen pip list
has a --not-required
option, which excludes packages that are dependencies of other installed packages. –
Chagres --use-feature=2020-resolver
at the end of the command and that resolved it. –
Kedgeree distro-info
, which breaks do-release-upgrade
. See this AskUbuntu question askubuntu.com/questions/1182208/… –
Wilcher pip3 list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install -U
–
Hardnett pip list
has a --user
option, which restricts the output to the user's site-packages. This avoids messing with distro-info on Ubuntu, which can cause serious problems. –
Chagres pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U --user
- This is also a useful command. –
Teeming -r
to xargs, so it won't run pip -U
at all if there are no outdated packages? I did find this useful, otherwise I'd get the annoying message ERROR: You must give at least one requirement to install (see "pip help install")
if I'd type that command in some environment with no outdated packages. NOTE: it seems -r
option to xargs is a GNU extension. Enjoy! –
Shoot --format freeze
screams awk
. pip list -o --format freeze | awk 'BEGIN { FS="==" } { print $1 }' | xargs -n1 pip install -U
–
Citrine cut -d = -f 1 |
–
Denmark pip3 list --outdated --format=json | jq -r '.[] | "\(.name)==\(.latest_version)"' | xargs -n1 pip3 install --upgrade
. –
Blotter jq
. The first command lists outdated pip packages, the third cmd works for me: pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
. –
Quisling pip --disable-pip-version-check list --outdated --format=json | python -c "import json, sys, subprocess; [subprocess.call(['pip', 'install', '--upgrade', x['name']]) for x in json.load(sys.stdin)]"
–
Asparagine pip3 list --outdated | awk '{print $1}' | xargs -n1 pip3 install --upgrade
worked for me. –
Salchunas To upgrade all local packages, you can install pip-review
:
$ pip install pip-review
After that, you can either upgrade the packages interactively:
$ pip-review --local --interactive
Or automatically:
$ pip-review --local --auto
pip-review
is a fork of pip-tools
. See pip-tools
issue mentioned by @knedlsepp. pip-review
package works but pip-tools
package no longer works. pip-review
is looking for a new maintainer.
pip-review
works on Windows since version 0.5.
NameError: name 'raw_input' is not defined
-- Broken for me. –
Cimah pip-review
(that automates installing new versions for you). In other words if you are in an environment where it makes sense to use pip-review
tool then you can afford to install it too. –
Outsell pip-review
in its dev-requirements.txt
. It could become part of PIP. –
Episcopate pip-dump
may help you to maintain the requirements file). See Upgrade python in a virtualenv –
Outsell pip-review --auto --user
–
Undesirable python.exe -m pip_review
instead of pip-review
. (note the underscore instead of the dash) –
Iggie onedrivesdk
package that is unrelated to pip-review
. –
Outsell You can use the following Python code. Unlike pip freeze
, this will not print warnings and FIXME errors.
For pip < 10.0.1
import pip
from subprocess import call
packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)
For pip >= 10.0.1
import pkg_resources
from subprocess import call
packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), shell=True)
import pip
pip.install('packagename')
? –
Katinakatine pip
in this case is the pip.exe
of the "default" Python. I changed it to call("%s\\Scripts\\pip.exe install --upgrade %s" % (dirname(sys.executable), dist.project_name), shell=True)
which of course makes it unusable on non-Windows platforms, though. –
Topheavy pip.updateall()
would be perfect. –
Torticollis pip
doesn't write --upgrade
flag in their help –
Andie Permission denied
... Any way to prevent this operating on system packages? –
Undesirable dist.location
and filter the list accordingly. –
Demur [call("pip install " + name + " --upgrade") for name in packages]
–
Samarium from subprocess import call
to from subprocess import call, executable
and the call line to call([executable, "-mpip", "install", "--upgrade"].extend(packages)], shell=True)
then it will call the pip
for the current executable regardless of platform, venv, etc. –
Quartz py
) instead of some hardcoded paths to some possibly installed Python. As a side note, between my comment (from 2015) and now, I have also simply tapped into the pip
module directly instead of doing that via the shell. E.g. in one project I had the project offer the option to pull in missing packages. –
Topheavy The following works on Windows and should be good for others too ($
is whatever directory you're in, in the command prompt. For example, C:/Users/Username).
Do
$ pip freeze > requirements.txt
Open the text file, replace the ==
with >=
, or have sed do it for you:
$ sed -i 's/==/>=/g' requirements.txt
and execute:
$ pip install -r requirements.txt --upgrade
If you have a problem with a certain package stalling the upgrade (NumPy sometimes), just go to the directory ($), comment out the name (add a #
before it) and run the upgrade again. You can later uncomment that section back. This is also great for copying Python global environments.
Another way:
I also like the pip-review method:
py2
$ pip install pip-review
$ pip-review --local --interactive
py3
$ pip3 install pip-review
$ py -3 -m pip-review --local --interactive
You can select 'a' to upgrade all packages; if one upgrade fails, run it again and it continues at the next one.
requirements.txt
's =={version}
. For example: python-dateutil==2.4.2
to python-dateutil
for all lines. –
Narbonne $ pip freeze | cut -d '=' -f1> requirements.txt
in order to remove the version –
Gregarine pip3 install -r <(pip3 freeze) --upgrade
Effectively, <(pip3 freeze)
is an anonymous pipe, but it will act as a file object –
Peep xargs -L 1 -a <(pip3 freeze) pip3 install --upgrade
–
Peep $ pip freeze | cut -d '=' -f1> reqs
and then I open file and comment cytoolz
(using #
) which was causing errors; finally $ pip install -r reqs --upgrade
. –
Substrate pip3 install -r <(pip3 freeze | cut -d '=' -f1) --upgrade
works on Bash. –
Hyracoid $pfr=$(pip freeze > requirements.txt) $pfr=$pfr.split('=')
. Error WARNING: Could not generate requirement for distribution -p 20.2.3 (c:\python39\lib\site-packages): Parse error at "'-p==20.2'": Expected W:(abcd...)
–
Quisling py -3 -m pip-review --local --interactive
gave an error: No module named pip-review
. Simply pip-review
worked for me. –
Ascocarp pip list --format=freeze > requirements.txt
The update gave me errors: OS error file not found. In the generated requirements.txt there were weird paths. Solution comes from: link –
Teachin pip install pipupgrade
pipupgrade --verbose --latest --yes
pipupgrade helps you upgrade your system, local or packages from a requirements.txt
file! It also selectively upgrades packages that don't break change.
pipupgrade also ensures to upgrade packages present within multiple Python environments. It is compatible with Python 2.7+, Python 3.4+ and pip 9+, pip 10+, pip 18+, pip 19+.
Note: I'm the author of the tool.
Checking...
forever when I tried it. –
Draggle ~/.cache/pip
and ~/Library/Caches/pip
(on macOS) –
Magnificent ModuleNotFoundError: No module named 'ctypes.windll'
–
Iggie --latest
flag since it upgrades dependencies that possibly break change. –
Magnificent Windows version after consulting the excellent documentation for FOR
by Rob van der Woude:
for /F "delims===" %i in ('pip freeze') do pip install --upgrade %i
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i
Quicker since it'll only try and update "outdated" packages –
Ectoblast n
be number of installed packages, and m
<= n
number of "outdated" packages. your's will spin-up pip
for ALL packages for 1 + n
executions of pip
with n*log(n)
web lookups for versions and all dependencies, and m
downloads and installs. Mine will do n
web lookups for the --outdated
call then will only spinup m
pip
calls with m*log(n)
web lookups for dependencies + m
download and installs. for if m
<< n
I win :) –
Ectoblast for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i
. If this is run from a batch file, make sure to use %%i
instead of %i
. Also note that it's cleaner to update pip
prior to running this command using python -m pip install --upgrade pip
. –
Backbite for
command is built-in. It is not for powershell, where it would be better to use a native looping construct. If you still wanted to use this solution in powershell you would need to invoke cmd.exe explicitly: cmd /c "for /F ""delims==="" %i in ('pip freeze -l') do pip install -U %i"
–
Oid This option seems to me more straightforward and readable:
pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`
The explanation is that pip list --outdated
outputs a list of all the outdated packages in this format:
Package Version Latest Type
--------- ------- ------ -----
fonttools 3.31.0 3.32.0 wheel
urllib3 1.24 1.24.1 wheel
requests 2.20.0 2.20.1 wheel
In the AWK command, NR>2
skips the first two records (lines) and {print $1}
selects the first word of each line (as suggested by SergioAraujo, I removed tail -n +3
since awk
can indeed handle skipping records).
| xargs -n1
to prevent stop on failures –
Ferroconcrete The following one-liner might prove of help:
(pip >= 22.3)
as per this readable answer:
pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`
or as per the accepted answer:
pip --disable-pip-version-check list --outdated --format=json |
python -c "import json, sys; print('\n'.join([x['name'] for x in json.load(sys.stdin)]))" |
xargs -n1 pip install -U
(pip 20.0 < 22.3)
pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U
Older Versions:
pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U
xargs -n1
keeps going if an error occurs.
If you need more "fine grained" control over what is omitted and what raises an error you should not add the -n1
flag and explicitly define the errors to ignore, by "piping" the following line for each separate error:
| sed 's/^<First characters of the error>.*//'
Here is a working example:
pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
| sed 's/^<First characters of the error>.*//'
as needed. Thank you! –
Bobbiebobbin pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
–
Lumpfish You can just print the packages that are outdated:
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
–
Supramolecular python -m pip list outdated
(though it's not in requirements format). –
Heathenism python -m pip list --outdated
. –
Luteous More Robust Solution
For pip3, use this:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
For pip, just remove the 3s as such:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OS X Oddity
OS X, as of July 2017, ships with a very old version of sed (a dozen years old). To get extended regular expressions, use -E
instead of -r
in the solution above.
Solving Issues with Popular Solutions
This solution is well designed and tested1, whereas there are problems with even the most popular solutions.
The above command uses the simplest and most portable pip syntax in combination with sed and sh to overcome these issues completely. Details of the sed operation can be scrutinized with the commented version2.
Details
[1] Tested and regularly used in a Linux 4.8.16-200.fc24.x86_64 cluster and tested on five other Linux/Unix flavors. It also runs on Cygwin64 installed on Windows 10. Testing on iOS is needed.
[2] To see the anatomy of the command more clearly, this is the exact equivalent of the above pip3 command with comments:
# Match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"
# Separate the output of package upgrades with a blank line
sed="$sed/echo"
# Indicate what package is being processed
sed="$sed; echo Processing \1 ..."
# Perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"
# Output the commands
sed="$sed/p"
# Stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local | sed -rn "$sed" | sh
[3] Upgrading a Python or PIP component that is also used in the upgrading of a Python or PIP component can be a potential cause of a deadlock or package database corruption.
sed
of OS X is to use gsed
(GNU sed) instead. To get it, brew install gnu-sed
–
Nicholasnichole I had the same problem with upgrading. Thing is, I never upgrade all packages. I upgrade only what I need, because project may break.
Because there was no easy way for upgrading package by package, and updating the requirements.txt file, I wrote this pip-upgrader which also updates the versions in your requirements.txt
file for the packages chosen (or all packages).
pip install pip-upgrader
Activate your virtualenv (important, because it will also install the new versions of upgraded packages in current virtualenv).
cd
into your project directory, then run:
pip-upgrade
If the requirements are placed in a non-standard location, send them as arguments:
pip-upgrade path/to/requirements.txt
If you already know what package you want to upgrade, simply send them as arguments:
pip-upgrade -p django -p celery -p dateutil
If you need to upgrade to pre-release / post-release version, add --prerelease
argument to your command.
Full disclosure: I wrote this package.
virtualenv
is not enabled pip-upgrade --skip-virtualenv-check
–
Ewart This seems more concise.
pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U
Explanation:
pip list --outdated
gets lines like these
urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]
In cut -d ' ' -f1
, -d ' '
sets "space" as the delimiter, -f1
means to get the first column.
So the above lines becomes:
urllib3
wheel
Then pass them to xargs
to run the command, pip install -U
, with each line as appending arguments.
-n1
limits the number of arguments passed to each command pip install -U
to be 1.
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
–
Condescendence Package
and --------------
in the output that'll ultimately be be passed to pip install -U
. I'm going to post an updated answer with my solution using sed and this approach without the above mentioned issue. –
Dorettadorette One-liner version of Ramana's answer.
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
sudo pip install
, use a virtual env, instead. –
Cayser From yolk:
pip install -U `yolk -U | awk '{print $1}' | uniq`
However, you need to get yolk first:
sudo pip install -U yolk
The pip_upgrade_outdated
(based on this older script) does the job. According to its documentation:
usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
[--serial | --parallel] [--dry_run] [--verbose]
[--version]
Upgrade outdated python packages with pip.
optional arguments:
-h, --help show this help message and exit
-3 use pip3
-2 use pip2
--pip_cmd PIP_CMD use PIP_CMD (default pip)
--serial, -s upgrade in serial (default)
--parallel, -p upgrade in parallel
--dry_run, -n get list, but don't upgrade
--verbose, -v may be specified multiple times
--version show program's version number and exit
Step 1:
pip install pip-upgrade-outdated
Step 2:
pip_upgrade_outdated
When using a virtualenv and if you just want to upgrade packages added to your virtualenv, you may want to do:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Output a list of installed packages into a requirements file (requirements.txt):
pip freeze > requirements.txt
Edit requirements.txt, and replace all ‘==’ with ‘>=’. Use the ‘Replace All’ command in the editor.
Upgrade all outdated packages
pip install -r requirements.txt --upgrade
pip freeze > requirements.txt
afterwards to see the acutal diff. –
Nereen pip freeze | sed 's/==/>=/' > requirements.txt
to swap the ==
with >=
automatically. –
Wilcher pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}
? –
Cornetist pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
would be more appropriate. –
Revelatory pip list --outdated --format freeze..
preferred over the suggested answer in Powershell, @Revelatory –
Quisling pip list
instead of pip freeze
. I figured --format freeze
would be more robust against possible changes in future updates than letting pip list
decide the format. pip freeze
also works! –
Revelatory The simplest and fastest solution that I found in the pip issue discussion is:
pip install pipdate
pipdate
Use AWK update packages:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
Windows PowerShell update
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
One line in PowerShell 5.1 with administrator rights, Python 3.6.5, and pip version 10.0.1:
pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}
It works smoothly if there are no broken packages or special wheels in the list...
[0]
in the script. –
Niela pip list --outdated --format json | jq '.[].name' | xargs -i pip install {} -U
–
Victualage You can try this:
for i in `pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done
If you have pip<22.3
installed, a pure Bash/Z shell one-liner for achieving that:
for p in $(pip list -o --format freeze); do pip install -U ${p%%=*}; done
Or, in a nicely-formatted way:
for p in $(pip list -o --format freeze)
do
pip install -U ${p%%=*}
done
After this you will have pip>=22.3
in which -o
and --format freeze
are mutually exclusive, and you can no longer use this one-liner.
for p in $(pip list -o --format freeze); do echo "${p} -> ${p%%=*}"; done
. In more general way, ${haystack%%needle}
means delete longest match of needle from back of haystack
. –
Enticement The rather amazing yolk makes this easy.
pip install yolk3k # Don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade
For more information on yolk: https://pypi.python.org/pypi/yolk/0.4.3
It can do lots of things you'll probably find useful.
The shortest and easiest on Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
There is not necessary to be so troublesome or install some package.
Update pip packages on Linux shell:
pip list --outdated --format=freeze | awk -F"==" '{print $1}' | xargs -i pip install -U {}
Update pip packages on Windows powershell:
pip list --outdated --format=freeze | ForEach { pip install -U $_.split("==")[0] }
Some points:
pip
as your python version to pip3
or pip2
.pip list --outdated
to check outdated pip packages.--format
on my pip version 22.0.3 only has 3 types: columns (default), freeze, or json. freeze
is better option in command pipes.ERROR: List format 'freeze' cannot be used with the --outdated option.
–
Folklore Ramana's answer worked the best for me, of those here, but I had to add a few catches:
import pip
for dist in pip.get_installed_distributions():
if 'site-packages' in dist.location:
try:
pip.call_subprocess(['pip', 'install', '-U', dist.key])
except Exception, exc:
print exc
The site-packages
check excludes my development packages, because they are not located in the system site-packages directory. The try-except simply skips packages that have been removed from PyPI.
To endolith: I was hoping for an easy pip.install(dist.key, upgrade=True)
, too, but it doesn't look like pip was meant to be used by anything but the command line (the docs don't mention the internal API, and the pip developers didn't use docstrings).
pip
apparently puts packages in /usr/local/lib/python2.7/dist-packages
or similar. You could use '/usr/local/lib/' instead of 'site-packages' in the if
statement in this case. –
Scrope Sent through a pull-request to the pip folks; in the meantime use this pip library solution I wrote:
from operator import attrgetter
## Old solution:
# from pip import get_installed_distributions
# from pip.commands import install
## New solution:
from pkg_resources import working_set
from pip._internal.commands import install
install_cmd = install.InstallCommand()
options, args = install_cmd.parse_args(
## Old solution:
# list(map(attrgetter("project_name")
# get_installed_distributions()))
## New solution:
list(map(attrgetter("project_name"), working_set))
)
options.upgrade = True
install_cmd.run(options, args) # Chuck this in a try/except and print as wanted
get_installed_distributions
–
Folklore install_cmd.parse_args(list(map(attrgetter("project_name"), working_set)))
- I'll edit this answer –
Eulaheulalee This ought to be more effective:
pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U
pip list -o
lists outdated packages;grep -v -i warning
inverted match on warning
to avoid errors when updatingcut -f1 -d1' '
returns the first word - the name of the outdated package;tr "\n|\r" " "
converts the multiline result from cut
into a single-line, space-separated list;awk '{if(NR>=3)print}'
skips header linescut -d' ' -f1
fetches the first columnxargs -n1 pip install -U
takes 1 argument from the pipe left of it, and passes it to the command to upgrade the list of packages.kerberos iwlib PyYAML Could pygpgme Could Could Could ...
Note all the "Could"s. Those stem from output of pip list -o
of "Could not find any downloads that satisfy the requirement <package>" –
Derron # pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
–
Derron pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ")
. Otherwise you could easily miss one line you don't want and get the result which DrStrangeprk mentioned. –
Delectate xargs
instead. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -U
The -r
flag ensures that pip install -U
won't be run if there are no outdated packages. The -p
flag prompts the user to confirm before executing any command. You can add the -n1
flag to have it prompt you prior to installing each package separately. –
Selfdenial This is a PowerShell solution for Python 3:
pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }
And for Python 2:
pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }
This upgrades the packages one by one. So a
pip3 check
pip2 check
afterwards should make sure no dependencies are broken.
This seemed to work for me...
pip install -U $(pip list --outdated | awk '{printf $1" "}')
I used printf
with a space afterwards to properly separate the package names.
A JSON + jq answer:
pip list -o --format json | jq '.[] | .name' | xargs pip install -U
jq
filtering can be further simplified to jq -c '.[].name'
–
Ster See all outdated packages
pip list --outdated --format=columns
Install
sudo pip install pipdate
then type
sudo -H pipdate
Here's the code for updating all Python 3 packages (in the activated virtualenv
) via pip:
import pkg_resources
from subprocess import call
for dist in pkg_resources.working_set:
call("python3 -m pip install --upgrade " + dist.project_name, shell=True)
Here is my variation on rbp's answer, which bypasses "editable" and development distributions. It shares two flaws of the original: it re-downloads and reinstalls unnecessarily; and an error on one package will prevent the upgrade of every package after that.
pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --
Related bug reports, a bit disjointed after the migration from Bitbucket:
Here is a script that only updates the outdated packages.
import os, sys
from subprocess import check_output, call
file = check_output(["pip.exe", "list", "--outdated", "--format=legacy"])
line = str(file).split()
for distro in line[::6]:
call("pip install --upgrade " + distro, shell=True)
For a new version of pip that does not output as a legacy format (version 18+):
import os, sys
from subprocess import check_output, call
file = check_output(["pip.exe", "list", "-o", "--format=json"])
line = str(file).split()
for distro in line[1::8]:
distro = str(distro).strip('"\",')
call("pip install --upgrade " + distro, shell=True)
Use:
import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
pip.main(['install', '--upgrade', pkg])
Or even:
import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)
It works fast as it is not constantly launching a shell.
I've been using pur lately. It's simple and to the point. It updates your requirements.txt
file to reflect the upgrades and you can then upgrade with your requirements.txt
file as usual.
$ pip install pur
...
Successfully installed pur-4.0.1
$ pur
Updated boto3: 1.4.2 -> 1.4.4
Updated Django: 1.10.4 -> 1.10.5
Updated django-bootstrap3: 7.1.0 -> 8.1.0
All requirements up-to-date.
$ pip install --upgrade -r requirements.txt
Successfully installed Django-1.10.5 ...
The below Windows cmd
snippet does the following:
- Upgrades
pip
to latest version.
requirements.txt
for any version specifiers.@echo off
Setlocal EnableDelayedExpansion
rem https://stackoverflow.com/questions/2720014/
echo Upgrading pip...
python -m pip install --upgrade pip
echo.
echo Upgrading packages...
set upgrade_count=0
pip list --outdated > pip-upgrade-outdated.txt
for /F "skip=2 tokens=1,3 delims= " %%i in (pip-upgrade-outdated.txt) do (
echo ^>%%i
set package=%%i
set latest=%%j
set requirements=!package!
rem for each outdated package check for any version requirements:
set dotest=1
for /F %%r in (.\python\requirements.txt) do (
if !dotest!==1 (
call :substr "%%r" !package! _substr
rem check if a given line refers to a package we are about to upgrade:
if "%%r" NEQ !_substr! (
rem check if the line contains more than just a package name:
if "%%r" NEQ "!package!" (
rem set requirements to the contents of the line:
echo requirements: %%r, latest: !latest!
set requirements=%%r
)
rem stop testing after the first instance found,
rem prevents from mistakenly matching "py" with "pylint", "numpy" etc.
rem requirements.txt must be structured with shorter names going first
set dotest=0
)
)
)
rem pip install !requirements!
pip install --upgrade !requirements!
set /a "upgrade_count+=1"
echo.
)
if !upgrade_count!==0 (
echo All packages are up to date.
) else (
type pip-upgrade-outdated.txt
)
if "%1" neq "-silent" (
echo.
set /p temp="> Press Enter to exit..."
)
exit /b
:substr
rem string substition done in a separate subroutine -
rem allows expand both variables in the substring syntax.
rem replaces str_search with an empty string.
rem returns the result in the 3rd parameter, passed by reference from the caller.
set str_source=%1
set str_search=%2
set str_result=!str_source:%str_search%=!
set "%~3=!str_result!"
rem echo !str_source!, !str_search!, !str_result!
exit /b
for /F "skip=2" %G in ('pip list --outdated') do pip install %G --upgrade
should do the job as well however preceding python -m pip install --upgrade pip
isn't a bad idea:) –
Numeration I have tried the code of Ramana and I found out on Ubuntu you have to write sudo
for each command. Here is my script which works fine on Ubuntu 13.10 (Saucy Salamander):
#!/usr/bin/env python
import pip
from subprocess import call
for dist in pip.get_installed_distributions():
call("sudo pip install --upgrade " + dist.project_name, shell=True)
Here is another way of doing with a script in Python:
import pip, tempfile, contextlib
with tempfile.TemporaryFile('w+') as temp:
with contextlib.redirect_stdout(temp):
pip.main(['list', '-o'])
temp.seek(0)
for line in temp:
pk = line.split()[0]
print('--> updating', pk, '<--')
pip.main(['install', '-U', pk])
One liner (bash). Shortest, easiest, for me.
pip install -U $(pip freeze | cut -d = -f 1)
Explanations:
pip freeze
returns package_name==version
for each packagecut -d = -f 1
means "for each line, return the 1st line's field where fields are delimited by =
"$(cmd)
returns the result of command cmd
. So here, cmd
will return the list of package names and pip install -U
will upgrade them.pip install --upgrade `pip freeze | cut -d '=' -f 1`
. –
Feint import os
import pip
from subprocess import call, check_call
pip_check_list = ['pip', 'pip3']
pip_list = []
FNULL = open(os.devnull, 'w')
for s_pip in pip_check_list:
try:
check_call([s_pip, '-h'], stdout=FNULL)
pip_list.append(s_pip)
except FileNotFoundError:
pass
for dist in pip.get_installed_distributions():
for pip in pip_list:
call("{0} install --upgrade ".format(pip) + dist.project_name, shell=True)
I took Ramana's answer and made it pip3 friendly.
As another answer here stated:
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
Is a possible solution: Some comments here, myself included, had issues with permissions while using this command. A little change to the following solved those for me.
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Note the added sudo -H
which allowed the command to run with root permissions.
To upgrade only outdated versions on a local / user environment for pip3
pip3 install --user -U `pip3 list -ol --format=json|grep -Po 'name": "\K.*?(?=")'`
The switch -ol
works similar to --outdated --local
or -o --user
. On Debian Testing you might also add the switch --break-system-packages
to install command. But do that only on your own risk. This command might be useful on super up-to-date systems where AI runs and anything with root is avoided. It helps porting from Stable Diffusion 1.5 to 2.1 with rocm support for example.
sudo -H
) version when updating the packages for your whole system. –
Maquette If you are on macOS,
brew install jq
pip3 list --outdated
pip3 install --upgrade `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`
jq
is universal (and already installed). –
Annmarieannnora pip list --outdated --format json | jq '.[].name' | xargs -i pip install {} -U
–
Victualage One line in cmd:
for /F "delims= " %i in ('pip list --outdated --format=legacy') do pip install -U %i
So a
pip check
afterwards should make sure no dependencies are broken.
I use this one liner set up as an alias to upgrade my pip3 packages:
pip3 list --outdated | sed '1,2d; s/ .*//' | xargs -n1 pip3 install -U
or alternatively
pip3 list --outdated | tail -n +3 | cut -d ' ' -f1 | xargs -n1 pip3 install -U
(note that while it's most likely the case these aliases will work with most shells, you're shell will have to support either pip, sed, and xargs for the first alias or pip, tail, cut, and xargs for the 2nd alias which come preinstalled on most nix/nix-like systems)
pip3 list --outdated
gets a list of installed outdated pip3 packages:$ pip3 list --outdated
Package Version Latest Type
-------------- ------- ------ -----
dbus-python 1.2.18 1.3.2 sdist
pycairo 1.20.1 1.25.1 sdist
PyGObject 3.42.1 3.46.0 sdist
systemd-python 234 235 sdist
sed '1,2d; s/ .*//'
or tail -n +3 | cut -d ' ' -f1
removes the first 2 lines of output and all characters inclusively after the first space character for each remaining line:pip3 list --outdated | sed '1,2d; s/ .*//'
# pip3 list --outdated | tail -n +3 | cut -d ' ' -f1
dbus-python
pycairo
PyGObject
systemd-python
xargs -n1 pip3 install -U
passes the name of each package as an argument to pip3 install -U
(pip command to recursively upgrade all packages).I ran some benchmarks and sed
appeared to be faster on my system. I usedsed
and then tail
and cut
to edit a text file input 5000 times and timed it. Here are the results:
sed:
------------------
real 0m9.188s
user 0m6.217s
sys 0m3.232s
tail-cut:
------------------
real 0m12.869s
user 0m13.913s
sys 0m9.921s
The benchmark setup can be found in the gist -> HERE <-
for in a bat script:
call pip freeze > requirements.txt
call powershell "(Get-Content requirements.txt) | ForEach-Object { $_ -replace '==', '>=' } | Set-Content requirements.txt"
call pip install -r requirements.txt --upgrade
To upgrade all of your pip default packages in your default Python version, just run the below Python code in your terminal or command prompt:
import subprocess
import re
pkg_list = subprocess.getoutput('pip freeze')
pkg_list = pkg_list.split('\n')
new_pkg = []
for i in pkg_list:
re.findall(r"^(.*)==.*", str(i))
new = re.findall(r"^(.*)==.*", str(i))[0]
new_pkg.append(new)
for i in new_pkg:
print(subprocess.getoutput('pip install '+str(i)+' --upgrade'))
By using pip-upgrader
using this library you can easily upgrade all the dependencies packages. These are set up you follows.
pip install pip-upgrader
pip-upgrade path/of/requirements_txt_file
An interactive pip requirements upgrader. Because upgrading requirements, package by package, is a pain in the ass. It also updates the version in your requirements.txt file.
Use pipx instead:
pipx upgrade-all
pip3 upgrade-all
leads to ERROR: unknown command "upgrade-all"
I guess that command is removed again –
Folklore pip install --upgrade `pip list --format=freeze | cut -d '=' -f 1`
pip list --format=freeze
includes pip
and setuptools
. pip freeze
does not.
If you want upgrade only packaged installed by pip, and to avoid upgrading packages that are installed by other tools (like apt, yum etc.), then you can use this script that I use on my Ubuntu (maybe works also on other distros) - based on this post:
printf "To update with pip: pip install -U"
pip list --outdated 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo
I like to use pip-tools to handle this process.
Package pip-tools presents two scripts:
pip-compile: used to create a viable requirements.txt from a requirement.in file. pip-sync: used to sync the local environment pip repository to match that of your requirements.txt file.
If I want to upgrade a particular package say:
django==3.2.12
to
django==3.2.16
I can then change the base version of Django in requirements.in, run pip-compile and then run pip-sync. This will effectively upgrade django (and all dependent packages too) by removing older versions and then installing new versions.
It is very simple to use for upgrades in addition to pip package maintenance.
I use the following to upgrade packages installed in /opt/...
virtual environments:
( pip=/opt/SOMEPACKAGE/bin/pip; "$pip" install -U $("$pip" list -o | sed -n -e '1,2d; s/[[:space:]].*//p') )
(unrelated tip, if you need shell variables, run commands inside a ( ... )
subshell so as to not pollute)
If you are using venv
, where you don't need to use sudo
:
$ pip list --outdated --format=json \
| jq -r '.[].name' \
| xargs -n1 pip install -U
Explanation
pip list --outdated --format=json
Returns JSON-formatted list of all outdated packages
jq -r '.[].name'
Extracts name
from JSON output
xargs -n1 pip install -U
Upgrades all Python packages one by one
That works for me for Python 3.12 out of the box, directly or in a virtual envornment:
pip3 list -o | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U
python -c 'import pip; [pip.main(["install", "--upgrade", d.project_name]) for d in pip.get_installed_distributions()]'
One liner!
AttributeError: module 'pip' has no attribute 'get_installed_distributions'
–
Folklore All posted solutions here break dependencies.
From this conversation to include the functionality directly into pip, including properly managing dependencies:
The author of Meta Package Manager (MPM) writes that MPM can emulate the missing upgrade-all command:
mpm --pip upgrade --all
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
Another alternative to updating pip packages is:
pip install --upgrade $(pip freeze | cut -d '=' -f 1)
or
python -m pip install --upgrade $(pip freeze | cut -d '=' -f 1)
You can also use:
// python2
pip2 install --upgrade $(pip freeze | cut -d '=' -f 1)
python2 -m pip install --upgrade $(pip freeze | cut -d '=' -f 1)
// python3
pip3 install --upgrade $(pip freeze | cut -d '=' -f 1)
python3 -m pip install --upgrade $(pip freeze | cut -d '=' -f 1)
These commands will update all pip packages.
© 2022 - 2024 — McMap. All rights reserved.
pip freeze
(likebundle install
ornpm shrinkwrap
). Best to save a copy of that before tinkering. – Wenwenceslauspip list --format freeze | %{pip install --upgrade $_.split('==')[0]}
(I am unable to post an answer here yet) – Bensen