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

Python跨模块调用py文件函数返回值异常问题排查

问题根因

代码无法正常运行是3个核心错误导致的:

  • read_bus函数接收了bus_device入参但完全没有使用,函数内直接调用未定义的bus对象,运行第一行就会触发NameError,根本走不到后续读数据逻辑
  • 异常捕获分支没有初始化string变量,一旦读总线过程中报错,执行return string时会再次触发变量未定义错误,拿不到任何有效返回值
  • 总线接收逻辑没有超时退出机制,如果对应vcan0接口一直没有报文,程序会卡在while无限循环里假死
修复方案

首先安装CAN通讯依赖库:

pip install python-can

修复后的newcanmonitor.py

import can

def read_bus(bus_device, timeout=5):
    """Read data from `bus_device` until get a valid can message"""
    # 初始化总线实例,传入的设备参数在这里生效
    bus = can.interface.Bus(channel=bus_device, bustype='socketcan')
    string = ""
    message = None
    # 增加超时控制,避免程序死循环
    recv_retry_count = 0
    while recv_retry_count < timeout / 0.2:
        message = bus.recv(0.2)
        if message:
            break
        recv_retry_count += 1
    else:
        # 超时未收到报文直接返回错误信息
        return f"ERR: No message received on bus {bus_device}"

    try:
        string = "{}:ID={}:LEN={}".format("RX", message.arbitration_id, message.dlc)
        for x in range(message.dlc):
            string += ":{:02x}".format(message.data[x])
    except Exception as e:
        string = f"ERR: Parse message failed - {str(e)}"
    finally:
        # 用完关闭总线连接
        bus.shutdown()
    return string

main.py可直接沿用原有逻辑,也可增加简单的结果判断

import newcanmonitor
xy = newcanmonitor.read_bus('vcan0')
print(xy)
注意事项
  • 运行代码前先确认vcan0虚拟CAN接口已经在系统中创建并启动,否则总线初始化会直接失败
  • 如果对接硬件CAN设备,只需要把bustype参数改成对应硬件的适配类型,再补充对应硬件的初始化参数即可

内容的提问来源于stack exchange,提问作者deepsdog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:09:14