使用importlib.import_module时出现ModuleNotFoundError

时间:2019-06-14 17:54:08

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

我具有以下文件夹结构,并且在util.py中具有测试方法。运行util方法时,我在尝试获取所有类的模块中导入的模块出现错误。

Parent
--report <dir>
----__init__.py
----AReport.py
----names_list.py
--util.py

util.py

import inspect
import importlib
import importlib.util

def get_class_names(fileName):
    for name, cls in inspect.getmembers(importlib.import_module(fileName, package='report'), inspect.isclass):
        print(name, cls)

if __name__ == '__main__':
    get_class_names('report.names_list')

names_list.py

from AReport import AReport

class Team:
    name = ""
    def __init__(self, name):
        self.name = name

class Names_List(AReport):
    def __init__(self, name=None):
        AReport.__init__(self, name)

    def test(self):
        print('In test')        

AReport.py

from abc import ABCMeta, abstractmethod

class AReport(metaclass=ABCMeta):
    def __init__(self, name=None):
        if name:
            self.name = name

    def test(self):
        pass

从util运行测试方法时,出现以下错误:

ModuleNotFoundError: No module named AReport

2 个答案:

答案 0 :(得分:2)

假设您没有使用sys.pathPYTHONPATH进行任何更改,问题是AReport模块在​​util.py中不可见。

您可以通过在util.py顶部添加以下内容来进行检查:

import sys
print(sys.path)

这将打印出解释器将在其中查找模块的所有路径的列表。您将看到只有Parent模块的路径,因为这是运行util.py的位置。 The Module Search Path文档对此进行了解释:

  

导入名为spam的模块时,解释器首先搜索   具有该名称的内置模块。如果找不到,则进行搜索   在目录给定的目录列表中找到名为spam.py的文件   变量sys.pathsys.path从以下位置初始化:

     
      
  • 包含输入脚本的目录(或当前目录)   如果未指定文件)。
  •   
  • PYTHONPATH(目录名称列表,语法与   shell变量PATH)。
  •   
  • 与安装有关的默认设置。
  •   

完成时

from AReport import AReport

它将在父目录中寻找一个AReport模块,但是它不存在,因为只有report包直接位于/ path / to / Parent目录下,这就是Python引发ModuleNotFoundError。如果您改为

from report.AReport import AReport

它将起作用,因为report软件包位于/ path / to / Parent下。

如果要在导入时避免使用report.前缀,一种选择是将report包添加到sys.path上的util.py

import sys
sys.path.append("./report")

print(sys.path)
# should now show the /path/to/Parent/report on the list

然后您的from AReport导入现在可以使用了。另一种选择是在运行PYTHONPATH之前将/ path / to / Parent / report添加到util.py环境变量中。

export PYTHONPATH=$PYTHONPATH:/path/to/Parent/report

我通常使用PYTHONPATH选项进行测试,因此不需要修改代码。

答案 1 :(得分:0)

尝试:

from report.AReport import AReport