Check if module exists, if not install it
Question:
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'
Answers:
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.
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.
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
.
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'])
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.
You can use os.system
as follows:
import os
package = "package_name"
try:
__import__package
except:
os.system("pip install "+ package)
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.
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 ' 33[93m' is just code to print in certain colors
print(f"
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'
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.
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.
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
.
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'])
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.
You can use os.system
as follows:
import os
package = "package_name"
try:
__import__package
except:
os.system("pip install "+ package)
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.
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 ' 33[93m' is just code to print in certain colors
print(f"