You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:35:23