How to import a module given its name as string?

前端 未结 11 1392
不思量自难忘°
不思量自难忘° 2020-11-21 06:19

I\'m writing a Python application that takes as a command as an argument, for example:

$ python myapp.py command1

I want the application to

相关标签:
11条回答
  • 2020-11-21 06:42

    Nowadays you should use importlib.

    Import a source file

    The docs actually provide a recipe for that, and it goes like:

    import sys
    import importlib.util
    
    file_path = 'pluginX.py'
    module_name = 'pluginX'
    
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    
    # check if it's all there..
    def bla(mod):
        print(dir(mod))
    bla(module)
    

    This way you can access the members (e.g, a function "hello") from your module pluginX.py -- in this snippet being called module -- under its namespace; E.g, module.hello().

    If you want to import the members (e.g, "hello") you can include module/pluginX in the in-memory list of modules:

    sys.modules[module_name] = module
    
    from pluginX import hello
    hello()
    

    Import a package

    Importing a package (e.g., pluginX/__init__.py) under your current dir is actually straightforward:

    import importlib
    
    pkg = importlib.import_module('pluginX')
    
    # check if it's all there..
    def bla(mod):
        print(dir(mod))
    bla(pkg)
    
    0 讨论(0)
  • 2020-11-21 06:43

    With Python older than 2.7/3.1, that's pretty much how you do it.

    For newer versions, see importlib.import_module for Python 2 and and Python 3.

    You can use exec if you want to as well.

    Or using __import__ you can import a list of modules by doing this:

    >>> moduleNames = ['sys', 'os', 're', 'unittest'] 
    >>> moduleNames
    ['sys', 'os', 're', 'unittest']
    >>> modules = map(__import__, moduleNames)
    

    Ripped straight from Dive Into Python.

    0 讨论(0)
  • 2020-11-21 06:45

    Note: imp is deprecated since Python 3.4 in favor of importlib

    As mentioned the imp module provides you loading functions:

    imp.load_source(name, path)
    imp.load_compiled(name, path)
    

    I've used these before to perform something similar.

    In my case I defined a specific class with defined methods that were required. Once I loaded the module I would check if the class was in the module, and then create an instance of that class, something like this:

    import imp
    import os
    
    def load_from_file(filepath):
        class_inst = None
        expected_class = 'MyClass'
    
        mod_name,file_ext = os.path.splitext(os.path.split(filepath)[-1])
    
        if file_ext.lower() == '.py':
            py_mod = imp.load_source(mod_name, filepath)
    
        elif file_ext.lower() == '.pyc':
            py_mod = imp.load_compiled(mod_name, filepath)
    
        if hasattr(py_mod, expected_class):
            class_inst = getattr(py_mod, expected_class)()
    
        return class_inst
    
    0 讨论(0)
  • 2020-11-21 06:48

    Use the imp module, or the more direct __import__() function.

    0 讨论(0)
  • 2020-11-21 06:48

    The following worked for me:

    import sys, glob
    sys.path.append('/home/marc/python/importtest/modus')
    fl = glob.glob('modus/*.py')
    modulist = []
    adapters=[]
    for i in range(len(fl)):
        fl[i] = fl[i].split('/')[1]
        fl[i] = fl[i][0:(len(fl[i])-3)]
        modulist.append(getattr(__import__(fl[i]),fl[i]))
        adapters.append(modulist[i]())
    

    It loads modules from the folder 'modus'. The modules have a single class with the same name as the module name. E.g. the file modus/modu1.py contains:

    class modu1():
        def __init__(self):
            self.x=1
            print self.x
    

    The result is a list of dynamically loaded classes "adapters".

    0 讨论(0)
  • 2020-11-21 06:49

    The recommended way for Python 2.7 and 3.1 and later is to use importlib module:

    importlib.import_module(name, package=None)

    Import a module. The name argument specifies what module to import in absolute or relative terms (e.g. either pkg.mod or ..mod). If the name is specified in relative terms, then the package argument must be set to the name of the package which is to act as the anchor for resolving the package name (e.g. import_module('..mod', 'pkg.subpkg') will import pkg.mod).

    e.g.

    my_module = importlib.import_module('os.path')
    
    0 讨论(0)
提交回复
热议问题