我具有以下文件夹结构,并且在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
答案 0 :(得分:2)
假设您没有使用sys.path
或PYTHONPATH
进行任何更改,问题是AReport
模块在util.py中不可见。
您可以通过在util.py
顶部添加以下内容来进行检查:
import sys
print(sys.path)
这将打印出解释器将在其中查找模块的所有路径的列表。您将看到只有Parent
模块的路径,因为这是运行util.py
的位置。 The Module Search Path文档对此进行了解释:
导入名为
spam
的模块时,解释器首先搜索 具有该名称的内置模块。如果找不到,则进行搜索 在目录给定的目录列表中找到名为spam.py
的文件 变量sys.path
。sys.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