Check if Python Package is installed

Check if Python Package is installed

If you mean a python script, just do something like this:

Python 3.3+ use sys.modules and find_spec:

import importlib.util
import sys

# For illustrative purposes.
name = itertools

if name in sys.modules:
    print(f{name!r} already in sys.modules)
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you choose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f{name!r} has been imported)
else:
    print(fcant find the {name!r} module)

Python 3:

try:
    import mymodule
except ImportError as e:
    pass  # module doesnt exist, deal with it.

Python 2:

try:
    import mymodule
except ImportError, e:
    pass  # module doesnt exist, deal with it.

As of Python 3.3, you can use the find_spec() method

import importlib.util

# For illustrative purposes.
package_name = pandas

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name + is not installed)

Check if Python Package is installed

Updated answer

A better way of doing this is:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, -m, pip, freeze])
installed_packages = [r.decode().split(==)[0] for r in reqs.split()]

The result:

print(installed_packages)

[
    Django,
    six,
    requests,
]

Check if requests is installed:

if requests in installed_packages:
    # Do something

Why this way? Sometimes you have app name collisions. Importing from the app namespace doesnt give you the full picture of whats installed on the system.

Note, that proposed solution works:

  • When using pip to install from PyPI or from any other alternative source (like pip install http://some.site/package-name.zip or any other archive type).
  • When installing manually using python setup.py install.
  • When installing from system repositories, like sudo apt install python-requests.

Cases when it might not work:

  • When installing in development mode, like python setup.py develop.
  • When installing in development mode, like pip install -e /path/to/package/source/.

Old answer

A better way of doing this is:

import pip
installed_packages = pip.get_installed_distributions()

For pip>=10.x use:

from pip._internal.utils.misc import get_installed_distributions

Why this way? Sometimes you have app name collisions. Importing from the app namespace doesnt give you the full picture of whats installed on the system.

As a result, you get a list of pkg_resources.Distribution objects. See the following as an example:

print installed_packages
[
    Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages),
    six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages),
    requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages),
]

Make a list of it:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    Django,
    six,
    requests,
]

Check if requests is installed:

if requests in flat_installed_packages:
    # Do something

Leave a Reply

Your email address will not be published.