2013-07-04 65 views
0

我正在使用django API製作網站。 問題是我收到一個怪異的導入錯誤。我有一個文件中的函數調用另一個文件中的另一個函數,該文件又調用第一個文件中的第三個函數。使用python和Django時導入錯誤

問題在於第三個功能。當我嘗試導入它,我得到一個錯誤

cannot import deletefromS3. 

一個完整的堆棧跟蹤如下

http://dpaste.com/1288190/

這裏給出的是兩個模塊的代碼片段:

topichandler.py:

from sdbhandler.mediahandler import deleteMediaParent 
def deletefromS3(itemid,folder): 
itemid=folder+itemid 
bucket = connect_s3() 
for key in bucket: 
    fname=key.split(".")[0] 
    if(fname==itemid): 
     bucket.delete_key(key) 
     return [] 


def deleteTopic(itemid,parentId='NULL'): 
    sdb=connect() 
    domain= sdb.get_domain(DOMAIN) 
    rootitem = domain.get_item(itemid) 
    if(parentId=='NULL'): 
      query= 'select * from ' + DOMAIN + ' where itemName()="'+itemid+'"' 
      rs = domain.select(query) 
    else: 
      rs = [rootitem] 
    for item in rs: 
      deleteMediaParent(item.name) 
      deletefromS3(item.name,'topicsK2/') 
      domain.delete_attributes(item.name) 
    deleteMediaParent(rootitem.name) 
    deletefromS3(rootitem.name,'topicsK2/') 
    domain.delete_attributes(rootitem.name) 

mediahandler.py:

from sdbhandler.topichandler import deletefromS3 
def deleteMediaParent(parentid): 
sdb=connect() 
domain = sdb.get_domain(DOMAIN) 
query = 'select * from '+ DOMAIN + 'where ' +FIELD_TopicID + ' = "' + parentid + '"' 
rs = domain.select(query) 
for item in rs: 
    deleteQuestionParent(item.name) 
    deletefromS3(item.name,'mediaK2/') 
    domain.delete_attributes(item.name) 

還有更多的依賴關係,但我不能發佈我的整個代碼太多了。 我不能從調用方法的文件導入?

回答

2

導入是不可能的,因爲模塊必須完成加載才能導入事物。 當topichandler模塊加載時,它會嘗試從mediahandler導入deleteMediaParent。但mediahandler嘗試從topichandler導入deletefromS3,這會觸發另一次嘗試加載topichandler。 Python捕獲即將發生的無限循環,並引發錯誤。

我們來看一個更簡單的例子。這裏是foo.py

#!/usr/bin/env python2.7 

x = 3 

from bar import y 

print x, y 

這裏是bar.py

from foo import x 

y = x 

這使你得到了同樣的錯誤,出於同樣的原因。

儘管最好的解決方案可能是將代碼重構爲更加連貫的獨立模塊,但有一種解決方法。您可以通過移動它變成一個功能延遲進口,如:

#!/usr/bin/env python2.7 

x = 3 

from bar import y 

print x, y() 

bar.py

def y(): 
    from foo import x 
    return x 

需要注意的是,如果你運行的print實際上將被導入兩次......再次,你可能是最好將相關功能移到同一個模塊中。

+0

因此,我在一個單獨的文件中定義該公共模塊? – Sohaib

+1

@SilentPro是的,你也可以這樣做。 – andrewdotn

+0

謝謝我是新來的python已經完成了我在java中的大部分編碼,所以不知道這些神經的某些可以這麼說。 – Sohaib