Python跨py文件导入类时自动执行源文件代码问题排查
问题产生原因
- Python模块导入的固有机制:当你通过
from BlobChang import BlobChang导入类时,Python会完整执行BlobChang.py内所有顶层(即不在类、函数定义内部)的代码,并不会只提取你要导入的BlobChang类。你写在类外的交互、循环逻辑,在导入语句执行的瞬间就会启动,不需要你主动调用。 - 死循环的直接触发逻辑:你写的循环
while if_yes(check_continue):只在第一次进入循环前读取了一次用户输入给check_continue赋值,循环内部接收用户“是否继续”输入时,赋值给了完全无关的check变量,从来没有更新过check_continue的值。只要第一次输入的是Y,循环判断条件永远为真,自然会卡在死循环里。 - 额外隐藏问题:这段顶层代码里直接使用了
x对象,但你从来没有在这段逻辑里实例化过BlobChang类赋值给x,就算解决了死循环问题,后续也会触发NameError。
修复方案
- 把
BlobChang.py中所有类定义之外的业务执行代码,全部放到if __name__ == '__main__':判断块内。这个判断的作用是:只有当你直接运行BlobChang.py脚本时,块内代码才会执行;当该文件被其他脚本作为模块导入时,块内代码不会触发,从根源避免导入时自动跑交互逻辑的问题。 - 修正循环内的变量赋值错误,把循环中接收用户继续输入的值赋给
check_continue,保证循环条件可以正常更新。 - 在直接运行的逻辑块内,提前实例化
BlobChang对象赋值给x,避免变量未定义错误。
修正后的BlobChang.py尾部代码参考如下:
if __name__ == '__main__': check_continue = input('Want to create a BlobChang? (Y/N): \n') x = BlobChang() # 提前实例化对象 while if_yes(check_continue): x.input() x.h() # 修正变量赋值错误,更新循环判断变量 check_continue = input('Want to continue? (Y/N): \n') check_qr = input('Do you want to create a QR Code? (Y/N): \n') if if_yes(check_qr): filename = str(input("Enter file name: "))+".png" qrcode.make(x.blobchang).save(filename) print("Your file name is: ", filename) print('Thank you for working with BlobChang!')
内容的提问来源于stack exchange,提问作者TheCodingCoconut
相关产品推荐
相关产品推荐

