我一直在寻找解决方案的互联网,我遇到的一切都没有帮助。现在我转向你。
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项目)
答案 0 :(得分:8)
您的问题是循环导入。
在cardreader
中,您可以这样做:
import ATRdb as ATR
开始导入ATRdb
,但在代码中输入几行,就会出现这个问题:
import cardreader
此处的确切顺序取决于cardreader.py
是否是您的主脚本,以及调用main
的顶级代码是否受if __name__ == '__main__'
后卫保护(以及假设顶级代码在cardreader
而不是其他地方。而不是试图详细解释所有可能性(或等待你告诉我们哪一个与你的实际代码匹配),让我们根据行为看看我们所知道的是真的:
在某种程度上,您在完成导入main
之前呼叫ATRdb
。
这意味着,此时ATRdb
中没有任何内容,只有sys
,MYSQLdb
和datetime
(以及每个模块获得的一些特殊属性)自动)。特别是,它还没有达到checkPerms
的定义,所以模块中还没有这样的属性。
当然最终它会完成导入ATRdb
的其余部分,但那时已经太晚了;您已拨打main
并尝试拨打ATR.checkPerms
但失败了。
虽然有各种复杂的方法可以使循环导入工作(有些人参见the official FAQ),但最简单,最干净的解决办法就是不要这样做。如果ATRdb
需要cardreader
中的某些功能,您应该将这些功能分解为第三个模块,例如cardutils
,ATRdb
和cardreader
都可以导入。