2013-12-19 25 views
4

我一直在淘金的解決方案,我遇到的一切都沒有幫助。所以現在我轉向你。AttributeError:'模塊'對象沒有任何屬性

Traceback (most recent call last): 
    File "cardreader.py", line 9, in <module> 
    import ATRdb as ATR 
    File "/home/pi/Desktop/CardReader/ATRdb.py", line 4, in <module> 
    import cardreader 
    File "/home/pi/Desktop/CardReader/cardreader.py", line 113, in <module> 
    main() 
    File "/home/pi/Desktop/CardReader/cardreader.py", line 40, in main 
    getData(db) 
    File "/home/pi/Desktop/CardReader/cardreader.py", line 98, in getData 
    if ATR.checkPerms(db,track1): 
AttributeError: 'module' object has no attribute 'checkPerms' 

我有兩個文件cardreader.py & ATRdb.py

---ATRdb.py有這個設置

import sys 
import MYSQLdb 
import datetime 
import cardreader 

def checkPerms(db, securitycode): 
    try: 
     cursor = db.cursor() 
     cursor.execute("""SELECT permissions FROM atrsecurity.employee WHERE securitycode = %s""", (securitycode)) 
     r = cursor.fetchone() 
     Permissions = r 
     if '3' in Permissions[0]: 
      return True 
     else: 
      return False 
    except Exception: 
     cardreader.main() 
     return False 

---cardreader.py有這個設置

import sys 
import usb.core 
import usb.util 
import MYSQLdb 
import ATRdb as ATR 

def main(): 
    db = MYSQLdb.connect(HOST,USER, PASS, DB) 
    print("Please swipe your card...") 
    getData(db) 
    main() 
    db.close() 
def getData(db): 
    # 
    #lots of code to get card data 
    # 
    if ATR.checkPerms(db, track1): 
     print ("User has permission") 
     unlockDoor() 

我在「If ATR.checkPerms():」部分得到錯誤。任何幫助將不勝感激 (第一個python項目)

+1

爲什麼'main'有自己的調用?特別是在關閉數據庫連接之前?這些是文件的完整內容嗎? – user2357112

+2

請發佈完整的錯誤和追溯,而不是用英文描述它。這裏有一個很好的機會在這裏沒有幫助,但它可能 - 這是一個很好的習慣,因爲回溯會立即給讀者提供答案的問題很多。 – abarnert

+0

主要的遞歸是因爲我們想要讀卡器。py繼續運行......等待卡片刷卡。不,還有更多的代碼,我沒有包括,但簡單的函數,如unlockDoor和一些日誌記錄信息 – MaylorTaylor

回答

8

您的問題是循環進口。

cardreader,你這樣做:

import ATRdb as ATR 

啓動進口ATRdb,但幾行到代碼,它擊中這個:

import cardreader 

從這裏的確切順序取決於是否cardreader.py是否是您的主要腳本,以及您調用main的頂級代碼是否受if __name__ == '__main__'守衛的保護(並假設頂級代碼位於cardreader而不是其他地方)。與其試圖詳細解釋所有可能性(或等待您告訴我們哪一個匹配您的實際代碼),讓我們根據行爲來看看我們所知的情況:

以某種方式,您在完成導入ATRdb之前調用main

這意味着,在這一點上,ATRdb沒有任何關係,但sysMYSQLdbdatetime(和每個模塊自動獲得特殊屬性的少數)。特別是還沒有涉及到checkPerms的定義,所以模塊中還沒有這樣的屬性。

當然,最終它會完成導入ATRdb的其餘部分,但在這一點上已經太晚了;您已經撥打main,並試圖撥打ATR.checkPerms,但失敗了。

雖然有各種複雜的方式來使循環進口工作(一些人蔘見the official FAQ),最簡單和最乾淨的解決方案就是不這樣做。如果ATRdb需要cardreader中的某些功能,那麼您應該將這些功能歸入第三個模塊,如cardutilsATRdbcardreader都可以導入。

+1

另外,請注意,即使循環導入問題不存在,您的代碼也會失敗,因爲'main()'自己調用它。由於導入'cardreader'運行'main()',它會導致程序崩潰(超過最大調用堆棧深度)。 –

+0

雖然問題是循環導入,但是循環導入如何導致問題的描述是錯誤的。 'cardreader.py'作爲主文件運行。它導入'ATRdb',它將'cardreader'作爲模塊導入(不同於將其作爲主文件運行),它試圖再次導入'ATRdb',而不是因爲'ATRdb'已被導入。 'cardreader'導入然後命中'main()'調用並開始運行,即使'ATRdb'沒有完成導入。請注意,主文件的執行尚未命中'main()';這個'main()'調用甚至不應該發生。 – user2357112

+0

@MaxNoel:請注意,在刷卡1000張牌之前它不會崩潰,並且沒有人希望它能夠長時間運行。不管這是否讓人接受,或者是一個噩夢的祕訣,人們都會注意到,直到所有原始開發者退出後的6個月,都難以猜測。 :) – abarnert

相關問題