任何人都可以解释python的相对import?

我不能让我的生活得到python的相对import工作。 我创build了一个不起作用的简单示例:

目录结构是:

/__init__.py /start.py /parent.py /sub/__init__.py /sub/relative.py 

/start.py只包含: import sub.relative

/sub/relative.py包含from .. import parent

所有其他文件都是空白的。

在命令行上执行以下命令时:

 $ cd / $ python start.py 

我得到:

 Traceback (most recent call last): File "start.py", line 1, in <module> import sub.relative File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module> from .. import parent ValueError: Attempted relative import beyond toplevel package 

我正在使用Python 2.6。 这是为什么? 我如何使这个沙箱的例子工作?

您正在从包“子”import。 即使存在__init__.py . start.py本身也不在包中。

您需要通过parent.py从一个目录启动程序:

 ./start.py ./pkg/__init__.py ./pkg/parent.py ./pkg/sub/__init__.py ./pkg/sub/relative.py 

start.py

 import pkg.sub.relative 

现在pkg是最高级的包,你的相对导入应该可以工作。


如果你想坚持你当前的布局,你可以使用import parent 。 因为你使用start.py来启动你的解释器,所以start.py所在的目录是你的pythonpath。 parent.py作为一个单独的模块存在于那里。

你也可以安全地删除顶层的__init__.py ,如果你不把任何东西导入目录树的脚本。

如果你打算直接调用relative.py ,也就是说,如果你真的想从顶层模块导入,你必须明确地将它添加到sys.path列表中。
这是它应该如何工作:

 # Add this line to the beginning of relative.py file import sys sys.path.append('..') # Now you can do imports from one directory top cause it is in the sys.path import parent # And even like this: from parent import Parent 

如果你认为上述可能会导致某种不一致,你可以使用这个:

 sys.path.append(sys.path[0] + "/..") 

sys.path[0]引用入口点的path。