我已经阅读了几个类似的问题,特别是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
就好了。造成这种情况的原因是什么?
答案 0 :(得分:0)
也许您可以通过将导入更改为:
来解决此问题from .utils import http
或者将您导入的文件夹添加到Python Path:
sys.path.append(os.path.join(root, source))
在thirdparty
中导入模块时,Python查找模块的位置仍然是主目录。初始导入有效,因为您提供了imp.find_module
的正确路径,但之后Python不知道在哪里查找模块。