2015-12-15 78 views
1

這工作在Python 3但在python 2發射一個ImportError(2.7版):Python的圓形相對導入在Python 3的工作,但不Python 2中

Shell命令:

$> python main.py 

main.py

import mymodule 

mymodule.KlassX().talk_klass_y() 
mymodule.KlassY().talk_klass_x() 

MyModule的/ __ init__.py

from .x import KlassX 
from .y import KlassY 
/y.py

from . import x # circular import 

def KlassY: 
    def talk(self): 
     print('Im in KlassY') 

    def talk_klass_x(self): 
     x.KlassX().talk() 

正如你可能已經注意到,我已經寫了圓形進口的相對進口的,因爲它是推薦的東西進口做

mymodule中/ x.py

from . import y # circular import 

def KlassX: 
    def talk(self): 
     print('Im in KlassX') 

    def talk_klass_y(self): 
     y.KlassY().talk() 

MyModule的包內(PEP-0328)。

我也試着做絕對導入:

from mymodule import y # in mymodule/x.py 
from mymodule import x # in mymodule/y.py 

但這只是仍然可以工作,蟒蛇3而不是(因爲同樣的導入錯誤的)蟒蛇2。

import y # in mymodule/x.py 
import x # in mymodule/y.py 

我真的不喜歡它,因爲「進口somemodule」作爲一個相對進口僅在Python的工作原理:

,我可以把它在Python 2的工作是使用相對進口具有以下不推薦的符號的唯一途徑2因爲在python 3中,它總是被迫成爲絕對導入。 我不明白爲什麼這個符號:

from mymodule import x 
# or 
from . import x 

其接受兩個Python 2和3,表現不同。

任何線索? 我應該如何正確地在Python 2中進行循環導入?

回答