AttributeError:'module'对象没有属性

时间:2013-12-19 20:11:45

标签: python

我一直在寻找解决方案的互联网,我遇到的一切都没有帮助。现在我转向你。

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&amp; 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()

我在“如果ATR.checkPerms():”部分得到错误。任何帮助,将不胜感激 (第一个python项目)

1 个答案:

答案 0 :(得分:8)

您的问题是循环导入。

cardreader中,您可以这样做:

import ATRdb as ATR

开始导入ATRdb,但在代码中输入几行,就会出现这个问题:

import cardreader

此处的确切顺序取决于cardreader.py是否是您的主脚本,以及调用main的顶级代码是否受if __name__ == '__main__'后卫保护(以及假设顶级代码在cardreader而不是其他地方。而不是试图详细解释所有可能性(或等待你告诉我们哪一个与你的实际代码匹配),让我们根据行为看看我们所知道的是真的:

在某种程度上,您在完成导入main之前呼叫ATRdb

这意味着,此时ATRdb中没有任何内容,只有sysMYSQLdbdatetime(以及每个模块获得的一些特殊属性)自动)。特别是,它还没有达到checkPerms的定义,所以模块中还没有这样的属性。

当然最终它会完成导入ATRdb的其余部分,但那时已经太晚了;您已拨打main并尝试拨打ATR.checkPerms但失败了。

虽然有各种复杂的方法可以使循环导入工作(有些人参见the official FAQ),但最简单,最干净的解决办法就是不要这样做。如果ATRdb需要cardreader中的某些功能,您应该将这些功能分解为第三个模块,例如cardutilsATRdbcardreader都可以导入。