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