动态导入模块会导致ImportError

时间:2016-06-30 22:42:55

标签: python python-3.x dynamic python-import dynamic-import

所以我一直在尝试创建一个简单的程序,它将动态导入具有特定名称的文件夹中的模块。我用os cd到目录,然后运行module = __import__(module_name)因为我在for循环中,所有描述的文件名都被迭代到变量module_name中。

我唯一的问题是我遇到了:

ImportError: No module named "module_name" 

(说出我作为字符串给出的变量的名称)。该文件存在,它位于所提到的目录中,import在同一目录中正常工作。但正常甚至导入不适用于cd目录中的模块。代码如下所示。如果这是一个显而易见的问题,我很抱歉。

import os

class Book():
    def __init__(self):
        self.name = "Book of Imps"
        self.moduleNames = []

    # configure path
    def initialize(self):
        path = os.getcwd() + '/Imp-pit'
        os.chdir(path)
        cwd = os.walk(os.getcwd())
        x, y, z = next(cwd)
        # Build Modules
        for name in z:
            if name[:3] == 'Imp':
                module_name = name[:len(name) - 3]
                module = __import__(module_name)

def start_sim():
    s = Book()
    s.initialize()

if __name__ == '__main__':
    start_sim()

2 个答案:

答案 0 :(得分:1)

如果您只是使用os.chdir更改当前目录,我认为解释器不会动态地更改 sys.path 。您必须手动将path变量插入sys.path列表才能使其正常工作,即:

sys.path.insert(0, path)  

Python在查找模块时通常会搜索sys.path,因此如果您在那里指定模块,它会找到它。

附加说明;请勿使用__import__,而应使用 importlib.import_module 。界面完全相同,但第二个通常在 documentation 中建议。

答案 1 :(得分:0)

您应该使用try-except概念,例如:

UIImageView

如果我确实理解你,那么

try:
    import csv            
except ImportError:
    raise ImportError('<error message>')