【问题标题】:Python-can - can.Logger Listener IssuePython-can - can.Logger 监听器问题
【发布时间】:2020-10-12 23:12:00
【问题描述】:

Python-can 包中的 can.Logger 监听器似乎没有将数据记录到文件中。

我知道有 CAN 总线数据,因为 can.Printer() 侦听器正在运行,它将 CAN 流量打印到输出终端。 can.Logger 侦听器似乎确实在目录中创建了 .asc 或 .blf 文件(无论文件类型在 file arg 中,它都会创建该文件),但它没有写入任何信息给它。

我认为它可能是 mode 参数,但从 'w' 或 'a' 等更改它似乎并没有什么不同。

知道为什么会发生这种情况吗?

我正在使用 Python 3.8.3、PyCharm 2020.1.2 社区版、Windows 10

def bus_log():
    bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
    logger = can.Logger('bus_log.asc', 'w')
    notifier = can.Notifier(bus, [can.Printer(), logger])

    try:
        while True:
            time.sleep(0.001)
    except KeyboardInterrupt:
        bus.shutdown()
        notifier.stop()


if __name__ == "__main__":
    bus_log()

编辑 1: 在重新安排代码和一些试验和错误之后,Try-Except 块似乎是问题所在。我仍然不明白为什么它不起作用。但我怀疑这与 PyCharm 的键盘中断功能有关。在我的原始代码中,我希望 KeyboardInterrupt 会发生,当它发生时,我会关闭总线和通知程序。但是我的理论是这没有发生,所以我的文件没有关闭。这是我的新代码:

def bus_log():
    bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
    logger = can.Logger('bus_log.asc', 'a')
    notifier = can.Notifier(bus, [can.Printer(), logger])

    time_1 = time.perf_counter()
    while True:
        time_2 = time.perf_counter()
        if time_2 >= time_1 + 5:
            notifier.stop()
            bus.shutdown()
        return


if __name__ == "__main__":
    bus_log()

【问题讨论】:

  • 更新:我一直在重新安排 Try except 块,我的问题似乎源于它。但是我无法始终如一地获取日志。我得到了两次,然后没有骰子。我认为键盘中断后日志没有关闭。因此,通知程序可能没有调用 .stop()。

标签: python logging listener can-bus python-can


【解决方案1】:

问题源于pycharm在选择停止按钮时不会发送键盘中断(Ctrl-C)命令,脚本只需停止。此外(CTRL-F2)又名停止按钮与 CTRL-C 不同。现在这似乎很明显,但我在一天的大部分时间里都没有意识到。

解决方案:

导航到 运行 > 编辑配置 > 选择 在输出控制台中模拟终端

从那里键盘中断功能(CTRL-C)将起作用。从那时起,我的脚本将正确终止通知器、侦听器和总线,从而保存日志文件。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2011-08-16
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多