【问题标题】:Dynamic importing modules results in an ImportError动态导入模块导致 ImportError
【发布时间】:2016-06-30 22:42:55
【问题描述】:

所以我一直在尝试制作一个简单的程序,该程序将动态导入具有特定名称的文件夹中的模块。我用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()

【问题讨论】:

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


    【解决方案1】:

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

    sys.path.insert(0, path)  
    

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

    附加说明;不要使用__import__,而是使用importlib.import_module。接口完全一样,但第二个一般建议在documentation

    【讨论】:

      【解决方案2】:

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

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

      如果我没听错的话

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

      【讨论】:

        猜你喜欢
        • 2012-10-04
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2022-06-18
        相关资源
        最近更新 更多