gpt4 book ai didi

python - 在 screen 上记录数据时用 Python 读取文件

转载 作者:行者123 更新时间:2023-11-28 22:06:26 27 4
gpt4 key购买 nike

背景

为了从逻辑 Controller 捕获数据,我使用了 screen作为终端仿真器并通过 KeySpan USA-19HS USB Serial Adapter 连接我的 MacBook .我创建了以下 bash 脚本,这样我就可以输入 talk2controller <filename>其中 filename 是数据文件的名称。

#!/bin/bash
if [ -z "$1" ]; then
echo Please provide the filename to save the logfile
exit
fi
LOGFILE=$1
echo "logfile $1" > screenrc # Set the logfile filename
echo "logfile flush 1" >> screenrc # Wait 1 sec before flushing buffer to filesystem
screen -L -c screenrc /dev/tty.KeySerial1 19200

我已经更改了日志文件的文件名,并将日志文件缓冲区刷新到文件系统之前的等待时间从默认的 10 秒更改为 1 秒。我将这些命令保存到 screenrc .然后我调用 screen :

  1. -L — 启用日志记录
  2. -c screenrc — 覆盖默认配置文件
  3. /dev/tty.KeySerial1 19200 — 使用 19200 的波特率与串口通信

我记录的每个测试大约需要 3-6 分钟,并且包含速度、加速度和位置信息。我会知道测试基于加速度是有效的。目前,我正在等到测试结束后再运行 Python matplotlib用于绘制速度、加速度和位置的脚本,以在继续下一个测试之前查看测试是否有效。

为了节省时间,我更愿意在测试进行到一半时绘制数据,同时仍在捕获数据。

问题

在我看来,在捕获更多数据的同时绘制数据有两种选择:

  • 选项 1:使用 screen 记录数据并让 Python matplotlib 脚本读取部分日志文件。
    • 问题 1:如果 Python 脚本读取日志文件,而 screen 仍在向其写入数据,会有什么问题?
  • 选项 2:从使用 screen 切换到使用 pySerial .但是,在测试期间绘制数据的优先级低于在测试期间简单地捕获数据。我不能在代码的绘图部分出现异常导致数据记录失败。这就是 screen 的伟大之处——它只是转储数据而不尝试做任何其他事情。
    • 问题 2:如果我要切换到 pySerial,我可以运行两个线程来减少代码的绘图部分不影响数据捕获代码的可能性吗?这对我有什么好处吗?

问题 3:有没有我没有想到的更好的选择?

最佳答案

选项 1 和 2 都可以,但是天啊,为了万物皆可,避免为此使用线程!您最终会遇到两全其美的情况:锁定问题,绘图线程中的异常无论如何都会杀死整个程序(包括日志记录线程)。正如其他人提到的那样,为此使用两个单独的过程很好。 screen 是用于此目的的工具选择有点奇怪,就像在 python 中手动编写代码一样。我只是将 talk2controller 脚本重写为这个微不足道的脚本:

stty -F /dev/tty.KeySerial1 19200 raw
cat </dev/tty.KeySerial1 >logfile

(如果您希望脚本的每次运行都附加到文件,而不是从头开始重写,您也可以使用 >>logfile。)

另一个问题是,只要其他人正在写入文件,是否可以让程序读取文件。这个问题的一个更具体的版本是:如果日志中的一行在您尝试阅读时写了一半怎么办?

答案是:你可以这样做,但你是对的,你不能保证一行在你读的时候不会写到一半。 (如果您编写自己的 catscreen 的替代品,您实际上可以通过始终使用 os.read() 写入文件来保证这一点而不是 sys.stdout.write()print。)

但是,无论如何都不需要这种保证。你只需要在阅读文件时小心点,你永远不会有问题。本质上,不完整的行只是没有以 \n 换行符结尾的行。因此:

for line in open('logfile'):
if not line.endswith('\n'): break
...handle valid line...

由于 \n 字符是日志每一行最后写入的内容,因此您可以肯定地知道,如果您阅读 \n 字符,它之前的所有内容写对了。

关于python - 在 screen 上记录数据时用 Python 读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3709698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com