我最终会知道应该是一个非常简单的问题。这是我写的一个简单示例的格式,试图解决我的问题。我在__all__ = ["p1","p2"]
中有__init__.py
的文件夹顶部。然后我有两个子文件夹p1和p2 __init__.py
,其中__all__
再次定义了两个简单模块quick1和快速2的名称,其中p1为quick1,p2为quick2。如果我从顶部以外的脚本导入top.p1.quick1,那么导入工作正常。但是,尝试从quick2导入top.p1.quick1会产生错误
File "quick1.py", line 1, in <module>
import top.p2.quick2
ImportError: No module named top.p2.quick2
如何从其他子包导入模块?据我所知,这应该根据python文档工作。有没有人看到我犯了一个明显的,微不足道的错误?
编辑:似乎我需要在我的搜索路径中添加top的目录。我可以通过设置PYTHONPATH暂时执行此操作。但是,有没有更好的方法从distutils脚本执行此操作?
答案 0 :(得分:3)
您的问题是您的顶级软件包不在您的sys.path中。
答案 1 :(得分:2)
你所描述的一切都很好,并没有重现错误 - 这是我能想到的最简单的版本:
$ mkdir /tmp/path
$ mkdir /tmp/path/top /tmp/path/top/p1 /tmp/path/top/p2
$ touch /tmp/path/top/__init__.py /tmp/path/top/p1/__init__.py /tmp/path/top/p2/__init__.py
$ touch /tmp/path/top/p1/quick1.py /tmp/path/top/p2/quick2.py$ echo 'import top.p1.quick1' > /tmp/path/top/p2/quick2.py
$ PYTHONPATH=/tmp/path python /tmp/path/top/p2/quick2.py
$ python -c 'import sys; sys.path.append("/tmp/path"); import top.p2.quick2'
它运行得很好。 __all__
除非您使用的是from ... import *
,否则top
无效(而且您不是)。只要/tmp/path
(此处为sys.path
)的父目录在{{1}}上,就可以了。如果那个父目录不在那里,你就会收到错误。
那么,为了重现你观察到的错误,你可以对这一系列操作做出的最小改变是什么?