动态导入模块会导致 ImportError 错误

3

所以,我一直在尝试编写一个简单的程序,可以动态地导入名称为特定名称的文件夹中的模块。我使用 os 命令进入该目录,并在for循环中迭代所有文件的名称并将其放入变量module_name中,随后运行命令module = __import__(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个回答

3
我认为解释器不会在你仅使用os.chdir更改当前目录时动态地更改sys.path。你需要手动将path变量插入sys.path列表中,才能使其起作用,即:
sys.path.insert(0, path)  

Python通常在查找模块时搜索sys.path,因此如果您在那里指定它,它将找到它。
另外注意; 不要使用__import__,而应该使用importlib.import_module。接口完全相同,但第二个通常在文档中建议使用。

0

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

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

如果我理解得正确的话,那么
try:
    module = __import__(module_name)
except ImportError:
    raise ImportError('<error message>')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接