1

Тема: Python: uptime в Windows и Linux

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from datetime import timedelta
from platform import system
from struct   import pack, unpack
from sys      import exit

if __name__ == '__main__':
  os = system()
  if 'Linux' == os:
     from ctypes import CDLL
     libc = CDLL('libc.so.6')
     si = pack('l9LH2LI', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 12, 13, 14)
     err = libc.sysinfo(si)
     if 0 != err:
        libc.perror('sysinfo')
        exit(err)
     si = unpack('l9LH2LI', si)
     print(timedelta(seconds=si[0]))
  elif 'Windows' == os:
     from ctypes import create_unicode_buffer, windll
     sti = pack('3q2L2Q', 1, 2, 3, 4, 5, 6, 7)
     nts = windll.ntdll.NtQuerySystemInformation(3, sti, len(sti), None)
     if 0 != nts:
        msg = create_unicode_buffer(0x100)
        err = windll.ntdll.RtlNtStatusToDosError(nts)
        print('Опаньки, понятия не имею что за ошибка!'
           if not windll.kernel32.FormatMessageW(
              0x12FF, None, err, 0x400, msg, len(msg), None
           ) else msg.value
        )
        exit(err)
     sti = unpack('3q2L2Q', sti)
     print(timedelta(seconds=int((sti[1] - sti[0]) // 1e7)))
  else:
     print('Не, не в курсе что за система.')

Лирическое отступление. В Linux помимо прочего можно воспользоваться услугами псевдофайловой системы proc, например:

awk '{printf("%d.%02d:%02d:%02d",($1/86400),($1/3600%24),($1%3600/60),($1%60))}' /proc/uptime

Что касается Windows, согласно слухам в Win11 несколько перекроили API и вроде там код работать не будет (увы, но проверить не представляется возможным). А вообще, NtQuerySystemInformation очень бажная штука, которая при заведомо неверных параметрах для некоторых SYSTEM_INFORMATION_CLASS возвращает STATUS_SUCCESS.