动态导入模块导致 ImportError

Dynamic importing modules results in an ImportError

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

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

ImportError: No module named "module_name" 

(说出我作为字符串给出的变量的名称)。该文件存在,它位于提到的目录中,并且 import 在同一目录中工作正常。但是正常的 even 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()

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

sys.path.insert(0, path)  

Python一般在找模块的时候会搜索sys.path,所以你在那里指定它就会找到。

补充说明;不要使用 __import__,而是使用 importlib.import_module. The interface is exactly the same but the second is generally advised in the documentation.

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

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

如果我没看错你就更正

try:
    module = __import__(module_name)
except ImportError:
    raise ImportError('<error message>')