Search code examples
pythonlinuxsubprocess

How to install and import Python modules at runtime


I want to write a script to automatically setup a brand new ubuntu installation and install a django-based app. Since the script will be run on a new server, the Python script needs to automatically install some required modules.

Here is the script.

#!/usr/bin/env python

import subprocess
import os
import sys

def pip_install(mod):
    print subprocess.check_output("pip install %s" % mod, shell=True)

if __name__ == "__main__":
    if os.getuid() != 0:
        print "Sorry, you need to run the script as root."
        sys.exit()

    try:
        import pexpect
    except:
        pip_install('pexpect') 
        import pexpect        

    # More code here...

The installation of pexpect is success, however the next line import pexpect is failed. I think its because at runtime the code doesn't aware about the newly installed pexpect.

How to install and import Python modules at runtime? I'm open to another approaches.


Solution

  • I solved my problem using the imp module.

    #!/usr/bin/env python
    
    import pip
    import imp
    
    def install_and_load(package):
        pip.main(['install', package])
    
        path = '/usr/local/lib/python2.7/dist-packages'
        if path not in sys.path:
            sys.path.append(path)
    
        f, fname, desc = imp.find_module(package)
        return imp.load(package, f, fname, desc)
    
    if __name__ == "__main__":
        try:
            import pexpect
        except:
            pexpect = install_and_load('pexpect')
    
        # More code...
    

    Actually the code is less than ideal, since I need to hardcode the Python module directory. But since the script is intended for a known target system, I think that is ok.