动态获取模块

时间:2014-07-13 07:17:58

标签: python python-2.7 module

我有一些这样的模块:

    Drivers/
        a.py
        b.py
        c.py

现在我想根据变量值来调用它们。 让我们考虑驱动程序是变量名称的变量。

    if driver=='a':
        #then call the driver a and execute.
        a.somefunction()
    if driver=='b':
        #then call the driver b and execute

我知道if语句中的驱动程序的值是字符串类型值,而if语句中我们必须调用模块。 有没有办法转换它。??

5 个答案:

答案 0 :(得分:5)

如果您在python的搜索路径中的“Drivers /”目录,只需导入模块并调用该函数:

import importlib
module = importlib.import_module(driver)
module.some_function()

答案 1 :(得分:2)

如果模块处于同一级别(完全是您的情况),只需

module = __import__(driver)
module.somefunction()

driver可以是string,例如'a''b''c'。如果该模块不存在,则会引发ImportError

答案 2 :(得分:1)

这是另一种方法:

def default_action():
    print('I will do this by default')
    return 42

the_function = default_action 

if driver == 'a':
    from a import somefunction as the_function
if driver == 'b':
    from b import some_other_function as the_function
if driver == 'c':
    from c import some_other_function as the_function

print('Running the code ... ')
result = the_function()
print('Result is: {}'.format(result))

您必须确保Drivers/变量中PYTHONPATH的完整路径。

答案 3 :(得分:0)

或者你可以使用它:

import imp
py_mod = imp.load_module(driver, *imp.find_module(driver, ['Drivers']))

答案 4 :(得分:0)

您应该在此处阅读有关模块搜索路径的信息: https://docs.python.org/2/tutorial/modules.html#the-module-search-path

此讨论显示如何将字符串转换为命令: http://www.daniweb.com/software-development/python/threads/198082/converting-string-to-python-code

您案例的基本示例如下:

假设a和b是root中的linux目录

import sys
import os

if driver=='a':
    # add /a to the module search path
    sys.path.append(os.path.join(['/', driver]))

    command_string = 'import ' + driver + '.py'

    # converts a string to python command
    exec(command_string)
    #then call the driver a and execute.
    a.somefunction()
if driver=='b':

    sys.path.append(os.path.join(['/', driver]))

    command_string = 'import ' + driver + '.py'

    # converts a string to python command
    exec(command_string)
    #then call the driver b and execute