从子文件夹自动导入模块时,它们的导入失败

问题描述 投票:1回答:1

我已经阅读了几个类似的问题,特别是this one about imp.load_module,它似乎与我想要的接近,但是我不明白为什么我仍然遇到ImportErrors。这是我的文件夹层次结构:

imp.load_module

program\ __init__.py main.py thirdparty\ __init__.py css\ __init__.py css.py utils\ __init__.py http.py 中,我有以下代码。目的是搜索main.py目录并加载找到的每个模块。每个模块都在其自己的单独目录中。

thirdparty\

问题是import os import imp for root, dirs, files in os.walk("thirdparty"): for source in (s for s in files if s.endswith(".py")): name = os.path.splitext(os.path.basename(source))[0] m = imp.load_module(name, *imp.find_module(name, [root])) 恰好使用了自己的子文件夹,该子文件夹从css.py中加载了内容。它的一行显示:

utils

这就是失败的地方。运行main.py时出现此错误。

from utils import http

我很困惑。 Traceback (most recent call last): File "main.py", line 7, in <module> m = imp.load_module(name, *imp.find_module(name, [root])) File "thirdparty/css/css.py", line 1, in <module> from utils import http ImportError: No module named utils 是自包含在其自己的文件夹中的,当我分别运行css.py时,它可以导入css.py。是什么原因造成的?

python python-import relative-path python-packaging
1个回答
0
投票

也许您可以通过将导入更改为:来解决此问题:

utils

或通过添加导入到Python路径的文件夹:

from .utils import http

当在sys.path.append(os.path.join(root, source)) 中导入模块时,Python查找模块的位置仍然是主目录。最初的导入有效,因为您为thirdparty提供了正确的路径,但此后Python不知道在哪里寻找模块。

© www.soinside.com 2019 - 2024. All rights reserved.