Find which version of package is installed with pip


Using pip, is it possible to figure out which version of a package is currently installed?

I know about pip install XYZ --upgrade but I am wondering if there is anything like pip info XYZ. If not what would be the best way to tell what version I am currently using.

Asked By: Alexis



As of pip 1.3, there is a pip show command.

$ pip show Jinja2
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

In older versions, pip freeze and grep should do the job nicely.

$ pip freeze | grep Jinja2
Answered By: AdamKG

You can also install yolk and then run yolk -l which also gives some nice output. Here is what I get for my little virtualenv:

(venv)CWD> /space/vhosts/ 
project@pyramid 43> yolk -l
Chameleon       - 2.8.2        - active 
Jinja2          - 2.6          - active 
Mako            - 0.7.0        - active 
MarkupSafe      - 0.15         - active 
PasteDeploy     - 1.5.0        - active 
Pygments        - 1.5          - active 
Python          - 2.7.3        - active development (/usr/lib/python2.7/lib-dynload)
SQLAlchemy      - 0.7.6        - active 
WebOb           - 1.2b3        - active 
account         - 0.0          - active development (/space/vhosts/
distribute      - 0.6.19       - active 
egenix-mx-base  - 3.2.3        - active 
ipython         - 0.12         - active 
logilab-astng   - 0.23.1       - active 
logilab-common  - 0.57.1       - active 
nose            - 1.1.2        - active 
pbkdf2          - 1.3          - active 
pip             - 1.0.2        - active 
pyScss          - 1.1.3        - active 
pycrypto        - 2.5          - active 
pylint          - 0.25.1       - active 
pyramid-debugtoolbar - 1.0.1        - active 
pyramid-tm      - 0.4          - active 
pyramid         - 1.3          - active 
repoze.lru      - 0.5          - active 
simplejson      - 2.5.0        - active 
transaction     - 1.2.0        - active 
translationstring - 1.1          - active 
venusian        - 1.0a3        - active 
waitress        - 0.8.1        - active 
wsgiref         - 0.1.2        - active development (/usr/lib/python2.7)
yolk            - 0.4.3        - active 
zope.deprecation - 3.5.1        - active 
zope.interface  - 3.8.0        - active 
zope.sqlalchemy - 0.7          - active 
Answered By: Gustavo

I just sent a pull request in pip with the enhancement Hugo Tavares said:

(specloud as example)

$ pip show specloud

Package: specloud
Version: 0.4.4
Answered By: Bengineer

Pip 1.3 now also has a list command:

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
Answered By: RickyA

and with –outdated as an extra argument, you will get the Current and Latest versions of the packages you are using :

$ pip list --outdated
distribute (Current: 0.6.34 Latest: 0.7.3)
django-bootstrap3 (Current: 1.1.0 Latest: 4.3.0)
Django (Current: 1.5.4 Latest: 1.6.4)
Jinja2 (Current: 2.6 Latest: 2.8)

So combining with AdamKG ‘s answer :

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

Check pip-tools too :

Answered By: KevinS

The easiest way is this:

import jinja2
print jinja2.__version__
Answered By: user5730083

You can use the grep command to find out.

pip show <package_name>|grep Version


pip show urllib3|grep Version

will show only the versions.

Metadata-Version: 2.0
Version: 1.12

Answered By: Rajiv

On windows, you can issue command such as:

pip show setuptools | findstr "Version"


Version: 34.1.1
Answered By: Quinn

For Windows you can

  1. open cmd and type python, press enter.

  2. type the import and press enter.

  3. type ._version__ and press enter.

As you can see in screen shot here I am using this method for checking the version of serial module.


Answered By: DRPandya

There’s also a tool called pip-check which gives you a quick overview of all installed packages and their update status:

enter image description here

Haven’t used it myself; just stumbled upon it and this SO question in quick succession, and since it wasn’t mentioned…

Answered By: Ola Tuvesson

In question, it is not mentioned which OS user is using (Windows/Linux/Mac)

As there are couple of answers which will work flawlessly on Mac and Linux.

Below command can be used in case the user is trying to find the version of a python package on windows.

In PowerShell use below command :

pip list | findstr <PackageName>

Example:- pip list | findstr requests

Output : requests 2.18.4

Answered By: yetis200

The python function returning just the package version in a machine-readable format:

from importlib.metadata import version 

Prior to python 3.8:

pip install importlib-metadata 
from importlib_metadata import version

The bash equivalent (here also invoked from python) would be much more complex (but more robust – see caution below):

import subprocess
def get_installed_ver(pkg_name):
    bash_str="pip freeze | grep -w %s= | awk -F '==' {'print $2'} | tr -d 'n'" %(pkg_name)
    return(subprocess.check_output(bash_str, shell=True).decode())

Sample usage:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"

>>> 0.22

Note that in both cases pkg_name parameter should contain package name in the format as returned by pip freeze and not as used during import, e.g. scikit-learn not sklearn or Flask-Caching, not flask_caching.

Note that while invoking pip freeze in bash version may seem inefficient, only this method proves to be sufficiently robust to package naming peculiarities and inconsistencies (e.g. underscores vs dashes, small vs large caps, and abbreviations such as sklearn vs scikit-learn).

Caution: in complex environments both variants can return surprise version numbers, inconsistent with what you can actually get during import.

One such problem arises when there are other versions of the package hidden in a user site-packages subfolder. As an illustration of the perils of using version() here’s a situation I encountered:

$ pip freeze | grep lightgbm


$ python -c "import lightgbm; print(lightgbm.__version__)"


$ python -c "from importlib_metadata import version; print(version("lightgbm"))"

until you delete the subfolder with the old version (here 2.2.3) from the user folder (only one would normally be preserved by `pip` - the one installed as last with the `--user` switch):

$ ls /home/jovyan/.local/lib/python3.7/site-packages/lightgbm*

Another problem is having some conda-installed packages in the same environment. If they share dependencies with your pip-installed packages, and versions of these dependencies differ, you may get downgrades of your pip-installed dependencies.

To illustrate, the latest version of numpy available in PyPI on 04-01-2020 was 1.18.0, while at the same time Anaconda’s conda-forge channel had only 1.17.3 version on numpy as their latest. So when you installed a basemap package with conda (as second), your previously pip-installed numpy would get downgraded by conda to 1.17.3, and version 1.18.0 would become unavailable to the import function. In this case version() would be right, and pip freeze/conda list wrong:

$ python -c "from importlib_metadata import version; print(version("numpy"))"

$ python -c "import numpy; print(numpy.__version__)"

$ pip freeze | grep numpy

$ conda list | grep numpy
numpy                     1.18.0                   pypi_0    pypi
Answered By: mirekphd

pip show works in python 3.7:

pip show selenium
Name: selenium
Version: 4.0.0a3
Summary: Python bindings for Selenium
Author-email: UNKNOWN
License: Apache 2.0
Location: c:python3.7libsite-packagesselenium-4.0.0a3-py3.7.egg
Requires: urllib3
Answered By: Superstone

To do this using Python code:

Using importlib.metadata.version

Python ≥3.8

import importlib.metadata

Python ≤3.7

(using importlib_metadata.version)

!pip install importlib-metadata

import importlib_metadata

Using pkg_resources.Distribution

import pkg_resources

Credited to comments by sinoroc and mirekphd.

Answered By: Asclepius
import pkg_resources
packages = [dist.project_name for dist in pkg_resources.working_set]
   for count, item in enumerate(packages):
      print(item, pkg_resources.get_distribution(item).version)
    pass here

The indentations might not be perfect. The reason I am using a Try- Except block is that few library names will throw errors because of parsing the library names to process the versions. even though packages variable will contain all the libraries install in your environment.

Answered By: Syenix

pip list can also be told to format its output as json.
It could be a safer approach to parse the version.

pip list --no-index --format=json | 
  jq -r '.[] | select(.name=="Jinja2").version'
# 2.10.1
Answered By: Romain
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.