我不能让python的相对导入工作。我已经创建了一个简单的例子,说明它不起作用:
目录结构为:
/__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
我正在使用Python2.6。为什么是这个案子?如何使这个沙盒示例工作?
如果要直接调用
relative.py
,也就是说,如果真的要从顶级模块导入,则必须显式地将其添加到sys.path
列表中。它的工作原理如下:
如果您认为上述内容可能导致某种不一致,则可以使用以下内容:
sys.path[0]
指的是运行入口点的路径。在python3中查看:
示例1:
如果我们这样运行(只是为了确保PYTHONPATH是空的):
输出:
如果我们在
sub/relative.py
中更改导入如果我们这样运行:
输出:
示例2:
运行方式:
输出:
如果我们在
sub/start.py
中更改导入:运行方式:
输出:
运行方式:
输出:
另外,最好使用从根文件夹导入,即:
运行方式:
输出:
您正在从包“sub”导入。
start.py
本身不在包中,即使存在__init__.py
。您需要从
parent.py
上的一个目录启动程序:使用
start.py
:现在pkg是顶级包,您的相对导入应该可以工作。
如果你想坚持你当前的布局,你可以使用
import parent
。因为使用start.py
启动解释器,所以start.py
所在的目录位于python路径中。parent.py
作为一个单独的模块存在。如果不将任何内容导入到目录树上的脚本中,也可以安全地删除顶层
__init__.py
。相关问题 更多 >
编程相关推荐