Check if module exists, if not install it
Asked Answered
C

11

51

I want to check if a module exists, if it doesn't I want to install it.

How should I do this?

So far I have this code which correctly prints f if the module doesn't exist.

try:
    import keyring
except ImportError:
    print 'f'
Chiliasm answered 24/12, 2010 at 17:30 Comment(5)
This will work in a script and check whether a module exists, but installing the module is a different case altogether.Mesarch
turns out using os.system() works.Chiliasm
subprocess.Popen is preferred to os.system.Rixdollar
Does this answer your question? How to check if a module is installed in Python and, if not, install it within the code?Kylander
This question is very old, and most answers, including the accepted ones and the trending ones, are outdated. I think the best, most up-to-date answer is in a duplicate of this question. For this reason, I chose to flag this question as duplicate instead of the newer one. People should be forwarded to the newer copy.Kylander
M
23

Here is how it should be done, and if I am wrong, please correct me. However, Noufal seems to confirm it in another answer to this question, so I guess it's right.

When writing the setup.py script for some scripts I wrote, I was dependent on the package manager of my distribution to install the required library for me.

So, in my setup.py file, I did this:

package = 'package_name'
try:
    return __import__(package)
except ImportError:
    return None

So if package_name was installed, fine, continue. Else, install it via the package manager which I called using subprocess.

Mesarch answered 24/12, 2010 at 17:48 Comment(1)
This is useful in principle, however it does not highlight a possible implementation of __import__(). See this answer for it: https://mcmap.net/q/268406/-how-to-check-if-a-module-is-installed-in-python-and-if-not-install-it-within-the-codeKylander
R
54
import pip

def import_or_install(package):
    try:
        __import__(package)
    except ImportError:
        pip.main(['install', package])       

This code simply attempt to import a package, where package is of type str, and if it is unable to, calls pip and attempt to install it from there.

Rangefinder answered 22/6, 2016 at 7:25 Comment(7)
This looks like a much more modern solution, but doesn't handle version pinning at all. I wonder how that would be done...?Revere
When I use this code I get Permission denied error.Sunshade
Try doing pip.main(['install', '--user', package]).Quianaquibble
It doesn't work for me I get the next error "{module 'pip' has no attribute 'main'}"Animato
For packages where their import and install names are different, I sent two variables: pkg_name and pip_name. For example: pip install google-api-python-client import googleapiclientYeseniayeshiva
how to get this to work with "from email import policy"Lisabethlisan
I think this is an improper solution; see https://mcmap.net/q/268406/-how-to-check-if-a-module-is-installed-in-python-and-if-not-install-it-within-the-code and its comments.Kylander
M
23

Here is how it should be done, and if I am wrong, please correct me. However, Noufal seems to confirm it in another answer to this question, so I guess it's right.

When writing the setup.py script for some scripts I wrote, I was dependent on the package manager of my distribution to install the required library for me.

So, in my setup.py file, I did this:

package = 'package_name'
try:
    return __import__(package)
except ImportError:
    return None

So if package_name was installed, fine, continue. Else, install it via the package manager which I called using subprocess.

Mesarch answered 24/12, 2010 at 17:48 Comment(1)
This is useful in principle, however it does not highlight a possible implementation of __import__(). See this answer for it: https://mcmap.net/q/268406/-how-to-check-if-a-module-is-installed-in-python-and-if-not-install-it-within-the-codeKylander
W
14

NOTE: Ipython / Jupyter specific solution.

While using notebooks / online kernels, I usually do it using systems call.

try:
  import keyring
except:
  !pip install keyring
  import keyring

P.S. One may wish to call conda install or mamba install instead.

Westernism answered 1/6, 2020 at 8:27 Comment(3)
what is !pip install pulp ?Hatred
IPython runs any command starting with ! on the shell .. Read this link. Thus, !pip install pulp will install pulp using pip from within jupyterWesternism
This question is not about IPython/Jupyer, and even then a better solution is to invoke with the ! a subprocess command, as described in https://mcmap.net/q/268406/-how-to-check-if-a-module-is-installed-in-python-and-if-not-install-it-within-the-codeKylander
S
11

This approach of dynamic import work really well in cases you just want to print a message if module is not installed. Automatically installing a module SHOULDN'T be done like issuing pip via subprocess. That's why we have setuptools (or distribute).

We have some great tutorials on packaging, and the task of dependencies detection/installation is as simple as providing install_requires=[ 'FancyDependency', 'otherFancy>=1.0' ]. That's just it!

But, if you really NEED to do by hand, you can use setuptools to help you.

from pkg_resources import WorkingSet , DistributionNotFound
working_set = WorkingSet()

# Printing all installed modules
print tuple(working_set)

# Detecting if module is installed
try:
    dep = working_set.require('paramiko>=1.0')
except DistributionNotFound:
    pass

# Installing it (anyone knows a better way?)
from setuptools.command.easy_install import main as install
install(['django>=1.2'])
Sharkey answered 25/12, 2010 at 1:55 Comment(1)
Here's a snapshot of the dead link.Malaysia
O
4

You can use os.system as follows:

import os

package = "package_name"

try:
    __import__package
except:
    os.system("pip install "+ package)
Overton answered 20/9, 2019 at 8:54 Comment(0)
Q
2

Here is my approach. The idea is loop until python has already installed all modules by built in module as "pip" .

import pip

while True:
    
    try:
        #import your modules here. !
        import seaborn
        import bokeh

        break

    except ImportError as err_mdl:
        
        print((err_mdl.name))
        pip.main(['install', err_mdl.name])
Quantitative answered 23/11, 2022 at 2:43 Comment(0)
L
1

You can launch pip install %s"%keyring in the except part to do this but I don't recommend it. The correct way is to package your application using distutils so that when it's installed, dependencies will be pulled in.

Loadstar answered 24/12, 2010 at 17:41 Comment(1)
distutils doesn't actually specify dependency information. You need to use setuptools or distribute in order to implement it.Nailbrush
M
1

Not all modules can be installed so easily. Not all of them have easy-install support, some can only be installed by building them.. others require some non-python prerequisites, like gcc, which makes things even more complicated (and forget about it working well on Windows).

So I would say you could probably make it work for some predetermined modules, but there's no chance it'll be something generic that works for any module.

Miriam answered 24/12, 2010 at 17:44 Comment(0)
C
1

I made an import_neccessary_modules() function to fix this common issue.

# ======================================================================================
# == Fix any missing Module, that need to be installed with PIP.exe. [Windows System] ==
# ======================================================================================
import importlib, os
def import_neccessary_modules(modname:str)->None:
    '''
        Import a Module,
        and if that fails, try to use the Command Window PIP.exe to install it,
        if that fails, because PIP in not in the Path,
        try find the location of PIP.exe and again attempt to install from the Command Window.
    '''
    try:
        # If Module it is already installed, try to Import it
        importlib.import_module(modname)
        print(f"Importing {modname}")
    except ImportError:
        # Error if Module is not installed Yet,  the '\033[93m' is just code to print in certain colors
        print(f"\033[93mSince you don't have the Python Module [{modname}] installed!")
        print("I will need to install it using Python's PIP.exe command.\033[0m")
        if os.system('PIP --version') == 0:
            # No error from running PIP in the Command Window, therefor PIP.exe is in the %PATH%
            os.system(f'PIP install {modname}')
        else:
            # Error, PIP.exe is NOT in the Path!! So I'll try to find it.
            pip_location_attempt_1 = sys.executable.replace("python.exe", "") + "pip.exe"
            pip_location_attempt_2 = sys.executable.replace("python.exe", "") + "scripts\pip.exe"
            if os.path.exists(pip_location_attempt_1):
                # The Attempt #1 File exists!!!
                os.system(pip_location_attempt_1 + " install " + modname)
            elif os.path.exists(pip_location_attempt_2):
                # The Attempt #2 File exists!!!
                os.system(pip_location_attempt_2 + " install " + modname)
            else:
                # Neither Attempts found the PIP.exe file, So i Fail...
                print(f"\033[91mAbort!!!  I can't find PIP.exe program!")
                print(f"You'll need to manually install the Module: {modname} in order for this program to work.")
                print(f"Find the PIP.exe file on your computer and in the CMD Command window...")
                print(f"   in that directory, type    PIP.exe install {modname}\033[0m")
                exit()


import_neccessary_modules('art')
import_neccessary_modules('pyperclip')
import_neccessary_modules('winsound')
Cytotaxonomy answered 24/6, 2020 at 19:32 Comment(0)
R
1

I tried this in a new virtual envoirnment with no packages installed and it installed the necessary package i.e. opencv-python Example is given below

import os

try:
    import cv2
except ImportError:
    os.system('pip install opencv-python')
Rapture answered 1/2, 2022 at 10:3 Comment(0)
W
0

I tried installing transformers using the below method and it worked fine. Similarly, you can just replace your library name instead of "transformers".


import pip
try:
    from transformers import pipeline
except ModuleNotFoundError:
    pip.main(['install', "transformers"])
    from transformers import pipeline
Wavelet answered 13/1, 2022 at 9:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.