首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块:AttributeError对象没有特性

模块:AttributeError对象没有特性
EN

Stack Overflow用户
提问于 2013-12-20 04:11:45
回答 1查看 16.7K关注 0票数 4

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

代码语言:javascript
复制
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具有此设置

代码语言:javascript
复制
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具有以下设置

代码语言:javascript
复制
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项目)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-20 04:23:49

您的问题是循环导入。

cardreader中,您可以执行以下操作:

代码语言:javascript
复制
import ATRdb as ATR

这将开始导入ATRdb,但是在代码中添加几行代码,就会遇到这样的情况:

代码语言:javascript
复制
import cardreader

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

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

这意味着,在这一点上,ATRdb中除了sysMYSQLdbdatetime (以及一些每个模块自动获得的一些特殊属性)之外什么也没有。特别是,它还没有得到checkPerms的定义,所以模块中还不存在这样的属性。

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

虽然有各种复杂的方法可以使循环导入工作(有关某些内容,请参阅the official FAQ ),但最简单、最干净的解决方案就是不这样做。如果ATRdb需要cardreader中的一些函数,您可能应该将这些函数分解到第三个模块中,比如cardutilsATRdbcardreader都可以导入。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20690772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档