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

1 投票
1 回答
970 浏览
提问于 2025-04-16 11:43

我看过一些类似的问题,特别是关于 这个关于 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 来加载一些东西。里面有一行代码是:

from utils import http

而这就是出错的地方。当我运行 main.py 时,就会出现这个错误。

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 时,它可以正常导入 utils。那到底是什么原因呢?

1 个回答

0

也许你可以通过把导入的方式改成这样来解决这个问题:

from .utils import http

或者你可以把你导入的文件夹添加到Python的路径中:

sys.path.append(os.path.join(root, source))

当你在thirdparty中导入模块时,Python查找模块的地方还是主目录。第一次导入能成功,是因为你给了imp.find_module正确的路径,但之后Python就不知道去哪里找这些模块了。

撰写回答