首页 > 解决方案 > 保持 python 日志记录脚本无限期运行的建议。脚本在几个小时后起作用

问题描述

我正在编写一个脚本来记录来自太阳能逆变器的串行数据。该脚本在 Windows 上运行了好几个小时,但随后开始起作用。

该脚本应该大约每分钟将调试数据打印到控制台并将日志数据写入 .csv 文件。

  1. 将调试数据打印到标准输出可以工作数小时,但随后开始变得零星。当我将鼠标悬停在 PowerShell 控制台上并再次聚焦时,打印似乎恢复了。Windows 是否将旧/非活动进程置于睡眠状态或其他什么?
  2. 该脚本应该大约每分钟将日志数据写入 .csv 文件,但有时它会持续数分钟而不更新 .csv 文件。当它最终更新文件时,不会丢失任何数据,因此它仍然清楚地在后台记录数据。编辑:仔细查看 .csv 数据,实际上数据中似乎存在时间中断,我假设该过程被暂停,然后再恢复。

我已经编程多年,但我是 python 新手。我确定我没有犯过溢出错误或类似的错误。我认为您不会从中收集到任何信息,但无论如何我已将脚本的主循环放在下面。

try:
    if not ser.is_open:
        print("Opening Serial")
        ser.open()

    # global inverterSettings
    inverterSettings = crc.readSettings(ser)

    qpigsColumns = dp.qpigsParamsModified.keys()
    print("qpigsColumns:\n", qpigsColumns)
    qpigsArray = pd.DataFrame([], columns=qpigsColumns)
    qpigsArray.set_index("24hDecimal", inplace=True)

    today = time.strftime(
        "%a, %d %b %Y", time.localtime()
    )  # nicely formatted date variable
    print("Sarting @ " + today)

    while 1:

        newToday = time.strftime(
            "%a, %d %b %Y", time.localtime()
        )  # checking for a new day every minute or so
        if today != newToday:
            today = newToday  # updating to new day
            qpigsArray = pd.DataFrame(
                [], columns=qpigsColumns
            )  # creating new dataFrame for new day
            qpigsArray.set_index("24hDecimal", inplace=True)
            print("\n" + today)

        # read solar data loop
        # --------------------
        print(".", end="", flush=True)

        for i in range(30):
            rawQpigsData = dp.readQPIGS(ser)
            data = pd.DataFrame([rawQpigsData], columns=qpigsColumns)
            data.set_index("24hDecimal", inplace=True)
            qpigsArray = qpigsArray.append(data, ignore_index=False)

        qpigsArray.to_csv(today + ".csv")

        # ---------

        if (rawQpigsData[-1] > 6) and (
            rawQpigsData[-1] < 18
        ):  # between 6 am and 6 pm (daylight hours)
            if (rawQpigsData[13] > PVocV / 2) and (
                rawQpigsData[15] < 10
            ):  # Panels have enough voltage, but not producing any solar power
                print("?", end="", flush=True)
                floatV = inverterSettings["userSettings"]["floatChargeV"]
                rx1 = crc.adjustFloatV(
                    (floatV - 0.1), ser
                )  # potential fix for panels not working?
                rx2 = crc.adjustFloatV((floatV + 0.1), ser)
                if rx1 == rx2 == "Ack":
                    print("?", end="", flush=True)
                else:
                    print("¿", end="", flush=True)
except Exception:
    traceback.print_exc()
finally:
    ser.close()

该脚本似乎没有崩溃或抛出任何错误。所以我假设这是 Windows 处理长时间运行进程的方式的错误。顺便说一句,我计划很快将其移至 r-pi。

所以总的来说,我需要关于如何设置 python 代码的建议,以便它可以在 Windows 和 r-pi 上无限期地运行,而不会进入睡眠状态,也不会在几个月后崩溃。通常如何处理这个?

标签: pythonwindowsloggingraspberry-pischeduling

解决方案


推荐阅读