任何人都可以解释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。