2014-11-15 149 views
0

我正在嘗試創建我的第一個高級python項目,但我很苦惱與導入很長時間。Python高級導入問題

有人能描述我在Python進口的使用情況如何?在官方網頁上找到有關Python導入文檔也不是那麼suffucient我...

下面是一個例子:

我有以下來源結構:

$ ls -ltrR 
.: 
total 1 
drwx------+ 1 Administrators None 0 Nov 15 14:09 b 
-rwx------+ 1 Administrators None 24 Nov 15 14:10 a.py 

./b: 
total 6 
-rwx------+ 1 Administrators None 0 Nov 15 14:08 c.py 
-rwx------+ 1 Administrators None 16 Nov 15 14:10 __init__.py 
drwx------+ 1 Administrators None 0 Nov 15 14:10 __pycache__ 
-rwx------+ 1 Administrators None 61 Nov 15 14:10 b.py 

及的內容文件:

$ cat a.py 
import b 

b.B().printC() 

$ cat b/b.py 
import c 

class B: 
    def printC(self): 
    print(c.C().get()) 

$ cat b/c.py 
class C(): 
    def get(self): 
    return 'This is C' 

$ cat __init__.py 
from .b import * 

當我啓動a.py它說:ImportError: No module named 'c'。 當我啓動b.py時,它說一切正常。

在b.py當我修改導入另一種解決方案,以「進口BC」 - >在這種情況下,當我打電話a.py它會工作,但是當我打電話只是b.py它是不會因爲b.py不知道b軟件包。

爲什麼我需要開始a.py和b.py也? a.py應該是UT的執行者,而b.py應該是UT。 這就是爲什麼我可能會打電話給所有的UT並啓動a.py,並且也可能發生我剛剛啓動特定的UT(b.py)。

回答

0

在您的a.py中,而不是隻有import b,請嘗試from b import b,因爲您想要從b模塊導入b.py。 或者,在你的B/初始化的.py,有from b import *但這是偏好的問題(看this thread關於此主題的更多信息)

This是上手模塊和包一個很好的教程。 (對於Python 2)

如果您正在使用Python 3,那麼它是一個有點不同。 Python 3不再支持隱式包名稱導入。 This link解釋得很好。所以,你必須明確提及所在的包實際上是通過使用相對導入 - from . import c代替import c(在你的b.py)和a.py:from b import b,而不是import b

我們避免使用a.py相對進口,因爲我們要運行它作爲一個腳本。在Python 3中,只需運行一個使用相對導入的模塊,腳本就會拋出Error:SystemError: Parent module '' not loaded, cannot perform relative importThis link解釋了這個問題並提供了一個解決方案。如果您想要像獨立腳本那樣執行模塊,則可以使用-m標誌:check the docs

所以,你的情況:

a.py:

from b import b 

b.B().printC() 

b.py:

from . import c 

class B: 
    def printC(self): 
     print(c.C().get()) 

c.py:沒有變化 其良好明確地只舉模塊/類/函數您真的需要導入而不是導入整個模塊,以提高查找效率。但是,如果您真的只想使用import b導入整個「b」包,而不是僅使用from b import b從b包導入b.py模塊,則需要包含所有要在之間發貨的所有模塊在b變量/初始化的.py像這樣:

__all__ = ['b', 'c'] 
from . import * 

this post很好的解釋。

希望這是有用的。

+0

from b import b 是不夠的,因爲b文件夾是一個包含很多UTs的文件夾,我不想一一列出UTs .. btw我試過了你的建議,但它不好,錯誤是相同。來自b import *的 仍然不正確。 ...感謝tuts我會檢查它們 – vpas

+0

我在你的代碼上運行了你的代碼,它工作正常。你正在使用哪個版本的Python? – kartikg3

+0

$ python --version Python 3.3.2 (也許我做錯了什麼,你能分享一下你的代碼嗎?) – vpas