繁体   English   中英

AttributeError:'module'对象没有属性

[英]AttributeError: 'module' object has no attribute

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

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

--- PATRdb.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项目)

你的问题是循环进口。

cardreader ,您执行此操作:

import ATRdb as ATR

这开始导入ATRdb ,但代码中有几行,它会点击:

import cardreader

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

在某种程度上,你在完成导入ATRdb之前调用main

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

当然最终它将完成导入ATRdb的其余部分,但那时为时已晚; 你已经调用了main ,它试图调用ATR.checkPerms并且失败了。

虽然有各种复杂的方法可以使循环导入工作(参见官方常见问题解答 ),但最简单,最干净的解决方案就是不要这样做。 如果ATRdb需要一些功能,这些功能在cardreader ,你应该这些因素进行到第三个模块,如cardutils ,既ATRdbcardreader可以导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM