2011-06-17 59 views
2

爲什麼'import ...'和'from ... import ...'之間存在差異,爲什麼我會使用第一個異常獲得異常?爲什麼'import x; x.y'的行爲與'from x import y'的行爲不同,當包x .__ init__沒有完成時,第一個失敗?

這裏是我的佈局:

/tmp/zero/ 
|~two/ 
| |-__init__.py 
| |-four.py 
| `-three.py 
|-__init__.py 
`-one.py 


/tmp/zero/one.py 
================= 
import zero.two 

    /tmp/zero/two/__init__.py 
    ================= 
    import zero.two.three 

    /tmp/zero/two/three.py 
    ================= 
    # this works 
    from zero.two import four 
    four.myprint() 

    # this FAILS 
    import zero.two.four 
    zero.two.four.myprint() 

    /tmp/zero/two/four.py 
    ================= 
    def myprint(): 
     print 'four.myprint' 

/tmp$ PYTHONPATH=/tmp/ python -c 'import zero.one' 
four.myprint 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "zero/one.py", line 1, in <module> 
    import zero.two 
    File "zero/two/__init__.py", line 1, in <module> 
    import zero.two.three 
    File "zero/two/three.py", line 9, in <module> 
    zero.two.four.myprint() 
AttributeError: 'module' object has no attribute 'two' 

回答

3

zero.two是一個模塊在那裏,zero/two/__init__.py。這是一件具體的事情,而不是一件神奇的事情。如果你把zero/two/__init__.py一行from . import four,它會開始工作。 os.path就是這樣一個例子 - 它是一個模塊,但是它的輸入是os/__init__.py,所以你可以import os; os.path

相關問題