2011-08-26 56 views
4

我注意到我已经提出了大约5个问题,询问有关相关进口,每个都有工作解决方案,但有不同的情况。我阅读的文档越多,越多地尝试不同的案例越多,我越来越困惑,并质疑我是否正确地阅读了单词。更多相关进口奇怪:..记号

从PEP 328:

A single leading dot indicates a relative import, 
starting with the current package. Two or more leading dots 
give a relative import to the parent(s) of the current package, 
one level per dot after the first. 

我的理解是, “当前包” 是关键字在这里。什么是“当前套餐”?它是执行开始的模块包吗? (即:__名称__ ==“__ main __”的文件)。

无论如何,这里是我使用..表示法的简单情况。

 
main/ 
    lib/ 
    __init__.py 
    myLib.py 
    plugin/ 
    __init__.py 
    needLib.py 
    run.py 

run.py进口needLib:from plugin import needLib

needLib进口MYLIB:from ..lib import myLib

发生了什么事在我的脑海:(needLib)上升一个包,进入lib下,抢MYLIB

下面是我如何执行:python run.py

结果:试图相对导入超越顶层包年龄

但是,当我将导入电话更改为from .lib import myLib时,它工作。

我不明白为什么后者的作品和..表示法没有。当然,main是不是一个包,所以怎么样我只是在一个init.py有奉送,导致

 
main/ 
    lib/ 
    __init__.py 
    myLib.py 
    other/ 
    __init__.py 
    needLib.py 
    __init__.py 
    run.py 

但是,这并没有区别;仍然在尝试导入超出顶层包

退房这个问题:python: forcing relative imports to search from script file

..符号确实工作!现在我想到了,我不明白它为什么起作用。该场景中的执行从相对导入发生的地方开始2级,而在此场景中的执行从相对导入发生的地方开始1级。除了我开始执行的地方外,情况完全相同。

两者都是我说的“去一个目录,进入lib包,并抓住你想要的模块”。

这种情况与参考情况的关键区别是什么?为什么..在那里工作,但不在这里?我使用2.6有什么关系吗?或者也许我是如何执行它? python run.py

回答

3

正如您发现的那样,from ..lib import myLib不起作用main不是一个包。相对导入只能在模块自己的包内工作。在你的例子中,libother是两个不同的软件包。

一个__init__.pymain把只有当你移动run外新建main包,使当前目录(的sys.path部分)包内的工作。