1

我已经阅读了几个类似的问题,尤其是这个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就好了。这是什么原因造成的?

4

1 回答 1

0

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

from .utils import http

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

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

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

于 2011-02-13T02:52:22.563 回答