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

时间:2011-02-13 01:42:51

标签: python import package relative

我已经阅读了几个类似的问题,特别是this one about imp.load_module这似乎与我想要的很接近,但我无法理解为什么我仍然会得到ImportErrors。这是我的文件夹层次结构:

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 :(得分:0)

也许您可以通过将导入更改为:

来解决此问题
from .utils import http

或者将您导入的文件夹添加到Python Path:

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

thirdparty中导入模块时,Python查找模块的位置仍然是主目录。初始导入有效,因为您提供了imp.find_module的正确路径,但之后Python不知道在哪里查找模块。