gpt4 book ai didi

python - 使用 importlib.import_module 时出现 ModuleNotFoundError

转载 作者:行者123 更新时间:2023-12-03 20:28:00 24 4
gpt4 key购买 nike

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

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

实用程序.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')


名称列表.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')

报表.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

最佳答案

假设您没有对 sys.path 进行任何更改或与 PYTHONPATH ,问题是 AReport模块在 util.py 中不“可见”。
您可以通过在 util.py 的顶部添加来检查这一点:

import sys
print(sys.path)
这将打印出解释器将查找模块的所有路径的列表。您会看到只有 Parent 的路径模块在那里,因为这是 util.py被跑了。这在 The Module Search Path 中有解释。文档:

When a module named spam is imported, the interpreter first searchesfor a built-in module with that name. If not found, it then searchesfor a file named spam.py in a list of directories given by thevariable sys.path. sys.path is initialized from these locations:

  • The directory containing the input script (or the current directorywhen no file is specified).
  • PYTHONPATH (a list of directory names, with the same syntax as theshell variable PATH).
  • The installation-dependent default.

当你运行 util.py从父目录(=“包含输入脚本的目录”),你做
from AReport import AReport
它将寻找 AReport父目录中的模块,但它不存在,因为只有 report包直接在/path/to/Parent 目录下。这就是 Python 提出 ModuleNotFoundError 的原因。 .如果你这样做
from report.AReport import AReport
它会起作用,因为 report包位于/path/to/Parent 下。
如果你想避免 report.导入时的前缀,一种选择是添加 report打包到 sys.pathutil.py :
import sys
sys.path.append("./report")

print(sys.path)
# should now show the /path/to/Parent/report on the list
然后你的 from AReport导入现在可以工作了。另一种选择是将/path/to/Parent/report 添加到您的 PYTHONPATH运行前的环境变量 util.py .
export PYTHONPATH=$PYTHONPATH:/path/to/Parent/report
我通常选择 PYTHONPATH测试选项,所以我不需要修改代码。

关于python - 使用 importlib.import_module 时出现 ModuleNotFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com