在 Raspberry Pi 上使用 Python 获得系统正常运行时间

get system uptime with Python on a Raspberry Pi

这个问题是指:

如果我在树莓派上使用程序,我会得到错误的时间:

~ $ uname -a
Linux raspberry 5.4.72-v7+ #1356 SMP Thu Oct 22 13:56:54 BST 2020 armv7l GNU/Linux


pi@raspberry:~ $ uptime
15:14:33 up 20 min,  3 users,  load average: 0,00, 0,08, 0,09

但输出是:

20 0 1 # days, hours, minutes

我正在使用:

import subprocess 
def uptime1(): # liefert Zeit in s
    raw = subprocess.check_output('uptime').decode("utf8").replace(',', '')
    days = int(raw.split()[2])
    if 'min' in raw:
        hours = 0
        minutes = int(raw[4])
    else:
        hours, minutes = map(int,raw.split()[4].split(':'))
    print(days, hours, minutes)    
    totalsecs = ((days * 24 + hours) * 60 + minutes) * 60
    return totalsecs

zeit=uptime1()

如何解决?

尝试为您设置正确的时区:

import os
os.environ['TZ']="America/New_York"
time.tzset()

如此处所述Launching python within python and timezone issue。 Subprosess 正在从 Python 上下文启动一个进程,这可能与您的系统不同。

我认为您解析 uptime 结果的逻辑需要改进。如果你想坚持自己的方式,你应该打印出你从输出中提取的每个子字符串,看看你是否拥有你认为的。我认为您会发现您需要对代码进行相当多的调整。为了帮助您开始,这里是拆分输出的结果:

['15:14:33', 'up', '20', 'min,', '3', 'users,', 'load', 'average:', '0,00,', '0,08,', '0,09']

您正在使用此拆分中的 [2][4],即分钟数和用户数,但您似乎期望第一个给您几天,第二个给您分钟。

作为另一种方式的建议,这里的代码将简单地从字符串中提取所有数字,这将为您提供评估输出中所有数据的起点:

import re

output = '15:14:33 up 20 min,  3 users,  load average: 0,00, 0,08, 0,09'

exp = re.compile(r"(\d+)")

i = 0
r = []

while True:
    m = exp.search(output, i)
    if not m:
        break
    r.append(int(m.group(1)))
    i = m.end(1)

print(r)

结果:

[15, 14, 33, 20, 3, 0, 0, 0, 8, 0, 9]

所以从这里开始,您只需执行 r[3]r[5] 等操作即可获取所有数字。这只是您解析输出的一种方式。

导入 os os.environ['TZ']="America/New_York" time.tzset()

我收到一个错误:

~ $ python3 /home/pi/melder_status.py 
Traceback (most recent call last):
  File "/home/pi/melder_status.py", line 11, in <module>
    time.tzset()
NameError: name 'time' is not defined

我找到了另一个解决方案:https://www.raspberrypi.org/forums/viewtopic.php?t=164276

#!/usr/bin/python3

import shlex, subprocess
cmd = "uptime -p"
args = shlex.split(cmd)
p = subprocess.Popen(args, stdout=subprocess.PIPE)
output = p.communicate()

感谢您发布的想法。 打印(输出)