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.
pip freeze
(like bundle install
or npm shrinkwrap
). Best to save a copy of that before tinkering. - anyone pip list --format freeze | %{pip install --upgrade $_.split('==')[0]}
(I am unable to post an answer here yet) - anyone 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!
Answered 2023-09-20 20:25:32
pip install -U
, it will update all packages. I'm afraid it can cause some conflict with apt-get. - anyone 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. - anyone -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
- anyone 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.
Answered 2023-09-20 20:25:32
pip-review --local --auto
- anyone 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)
Answered 2023-09-20 20:25:32
import pip
pip.install('packagename')
? - anyone 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.
Answered 2023-09-20 20:25:32
requirements.txt
's =={version}
. For example: python-dateutil==2.4.2
to python-dateutil
for all lines. - anyone $ pip freeze | cut -d '=' -f1> requirements.txt
in order to remove the version - anyone pip3 install -r <(pip3 freeze) --upgrade
Effectively, <(pip3 freeze)
is an anonymous pipe, but it will act as a file object - anyone 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.
Answered 2023-09-20 20:25:32
Checking...
forever when I tried it. - anyone ModuleNotFoundError: No module named 'ctypes.windll'
- anyone Checking... 2020-03-16 11:37:03,587 | WARNING | Unable to save package name. UNIQUE constraint failed: tabPackage.name 2020-03-16 11:37:13,604 | WARNING | Unable to save package name. database is locked 2020-03-16 11:37:13,609 | WARNING | Unable to save package name. database is locked
- anyone 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
Answered 2023-09-20 20:25:32
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i
Quicker since it'll only try and update "outdated" packages - anyone 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
. - anyone 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).
Answered 2023-09-20 20:25:32
| xargs -n1
to prevent stop on failures - anyone 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
Answered 2023-09-20 20:25:32
| sed 's/^<First characters of the error>.*//'
as needed. Thank you! - anyone pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
- anyone You can just print the packages that are outdated:
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Answered 2023-09-20 20:25:32
pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
- anyone python -m pip list outdated
(though it's not in requirements format). - anyone python -m pip list --outdated
. - anyone 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.
Answered 2023-09-20 20:25:32
sed
of OS X is to use gsed
(GNU sed) instead. To get it, brew install gnu-sed
- anyone 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.
Answered 2023-09-20 20:25:32
virtualenv
is not enabled pip-upgrade --skip-virtualenv-check
- anyone 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.
Answered 2023-09-20 20:25:32
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.
- anyone 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()]'
Answered 2023-09-20 20:25:32
sudo pip install
, use a virtual env, instead. - anyone From yolk:
pip install -U `yolk -U | awk '{print $1}' | uniq`
However, you need to get yolk first:
sudo pip install -U yolk
Answered 2023-09-20 20:25:32
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
Answered 2023-09-20 20:25:32
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
Answered 2023-09-20 20:25:32
The simplest and fastest solution that I found in the pip issue discussion is:
pip install pipdate
pipdate
Answered 2023-09-20 20:25:32
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
Answered 2023-09-20 20:25:32
pip freeze > requirements.txt
afterwards to see the acutal diff. - anyone pip freeze | sed 's/==/>=/' > requirements.txt
to swap the ==
with >=
automatically. - anyone pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Answered 2023-09-20 20:25:32
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}
? - anyone pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
would be more appropriate. - anyone pip list --outdated --format freeze..
preferred over the suggested answer in Powershell, @brainplot - anyone 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! - anyone 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]}
Answered 2023-09-20 20:25:32
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...
Answered 2023-09-20 20:25:32
[0]
in the script. - anyone 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.
Answered 2023-09-20 20:25:32
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
. - anyone 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.
Answered 2023-09-20 20:25:32
You can try this:
for i in `pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done
Answered 2023-09-20 20:25:32
The shortest and easiest on Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Answered 2023-09-20 20:25:32
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.Answered 2023-09-20 20:25:32
ERROR: List format 'freeze' cannot be used with the --outdated option.
- anyone 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).
Answered 2023-09-20 20:25:32
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. - anyone 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.Answered 2023-09-20 20:25:32
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>" - anyone # 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;
- anyone 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. - anyone 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. - anyone Sent through a pull-request to the pip folks; in the meantime use this pip library solution I wrote:
from pip import get_installed_distributions
from pip.commands import install
install_cmd = install.InstallCommand()
options, args = install_cmd.parse_args([package.project_name
for package in
get_installed_distributions()])
options.upgrade = True
install_cmd.run(options, args) # Chuck this in a try/except and print as wanted
Answered 2023-09-20 20:25:32
get_installed_distributions
- anyone