Python不同程序间导入while循环内变量失败,如何解决?
问题分析与解决
你的导入失败和while循环没有直接关系,核心问题出在变量作用域和__name__ == '__main__'的执行逻辑上:
1. 变量的作用域限制
你定义的data变量是在if __name__ == '__main__':代码块内部,并且嵌套在while循环的分支里。当你把communication.py作为模块导入时,__name__的值是communication而不是__main__,所以这个代码块里的所有代码都不会执行,data变量根本没有被定义,自然无法导入。
2. 就算去掉__name__判断也会有问题
如果删掉if __name__ == '__main__':,导入时会直接执行while循环(无限循环),导致你的print.py程序卡在导入步骤,根本无法继续执行。而且只有当Arduino发送"0.0"时,data才会被赋值,在此之前访问data会触发未定义错误。
解决方法
把串口通信逻辑封装成可调用的函数或类,让其他模块可以主动获取数据:
修改后的communication.py
import serial def get_arduino_data(): ser = serial.Serial('COM5', 9600, timeout=1) ser.reset_input_buffer() while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() if line == "0.0": yield (0, 0) # 可以添加其他数据处理逻辑 else: # 根据实际需求处理其他数据,比如返回原始值或其他格式 yield line if __name__ == '__main__': # 单独运行时的测试逻辑 for data in get_arduino_data(): print(data)
在print.py中调用
from communication import get_arduino_data for data in get_arduino_data(): print("获取到的数据:", data)
这样既可以保证模块导入时不会执行无限循环,又能通过函数主动获取Arduino的数据。
内容的提问来源于stack exchange,提问作者41_ Andi Yuda
相关产品推荐
相关产品推荐

