Python子包引用

时间:2010-02-26 16:58:27

标签: python import packages

我最终会知道应该是一个非常简单的问题。这是我写的一个简单示例的格式,试图解决我的问题。我在__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脚本执行此操作?

2 个答案:

答案 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}}上,就可以了。如果那个父目录不在那里,你就会收到错误。

那么,为了重现你观察到的错误,你可以对这一系列操作做出的最小改变是什么?