Найти - Пользователи
Полная версия: Простой системы
Начало » Python для экспертов » Простой системы
1 2 3
evgenyl
dll да вы че сума сошли ??? :)

так пойдет ?

import time
from ctypes import *
class LASTINPUTINFO(Structure):
_fields_ = [("cbSize", c_uint),("dwTime", c_uint)]
lii=LASTINPUTINFO(sizeof(LASTINPUTINFO),0)

while True:
windll.user32.GetLastInputInfo(pointer(lii))
print windll.kernel32.GetTickCount()-lii.dwTime
time.sleep(1)
hellslade
evgenyl
Во! просто чумовой вариант :) большой сенкс
aleko_s
Прошу прощения, что поднимаю старую тему. Под Windows решение задачи определения простоя юзера имеется… А как быть с аналогичной задачей под Mac OS?

Я нагуглил решение, связанное с использованием команды терминала ioreg -c IOHIDSystem……..
Но как-то не хочется перенаправлять вывод команды в файл с последующем открытием файла и поиском в нём нужного значения. Я попробовал в терминале выдать эту команду и ответом была немаленькая простынка текста. Понятно, что средствами той же операционки можно фильтровать вывод. Но хотелось бы знать, нет ли решения аналогичного виндовому. Может кто-то сталкивался
ZerG
uptime - и спарсить вывод ?
aleko_s
uptime показывает время от момента загрузки ОС, если я не ошибаюсь…. Хотелось бы получить время последнего действия юзера. Виндовая user32.GetLastInputInfo показывает время, когда юзер в последний раз что-то сделал клавой или мышью…. То есть разность текущего времени и времени , выдаваемого user32.GetLastInputInfo, даёт время простоя юзера (т.е. время, прошедшее после последнего телодвижения юзера.) Существование аналога виндовой функции user32.GetLastInputInfo в Маке облегчило бы мне задачу. Если аналога нет, придётся парсить вывод команды ioreg. Тоже не страшно, конечно, но как-то корявенько….


для ioreg нагуглил такую штуку

$ sleep 3; ioreg -c IOHIDSystem | grep HIDIdleTime|sed ‘s#.*“HID#”HID#’
“HIDIdleTime” = 2930089953
“HIDIdleTime” = 2932857364
“HIDIdleTime” = 2935033969
“HIDIdleTime” = 2936912079
“HIDIdleTime” = 2939724019
“HIDIdleTime” = 2941758207
“HIDIdleTime” = 2943638209
“HIDIdleTime” = 2952352977

Но в примере всё очень красиво округляется до трёх секунд. А если мне команда выдаст 8 существенно разных значений “HIDIdleTime”? Какие соответствуют клаве и мыши? Задачка….
JOHN_16
Это смотрели ? http://think.random-stuff.org/posts/mac-os-x-user-idle-time-in-python
А вот более правильно решение с ioreg https://www.dssw.co.uk/blog/2015-01-21-inactivity-and-idle-time/
aleko_s
Огромное спасибо! Для определённости остановился на решении с использованием ioreg, так как воочию убедился, что команда даёт искомую величину в числе прочих….

Получилась такая функция в python:

 import shlex, subprocess
def get_idle_duration():
    cmd1 = "ioreg -c IOHIDSystem"
    cmd2 = "sed -e '/HIDIdleTime/ !{ d' -e 't' -e '}' -e 's/.* = //g' -e 'q'"
    args1 = shlex.split(cmd1)
    args2 = shlex.split(cmd2)
    p1 = subprocess.Popen(args1, stdout=subprocess.PIPE)
    p2 = subprocess.Popen(args2, stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()
    out = p2.communicate()[0]
    ret = int(out)/1000000000
    
    return (ret)

Фактически, используются две команды, соединённые через PIPE - вторая фильтрует то, что выдала первая. Будучи чайником в OS X , я даже не посмотрел документацию по команде sed, интуитивно догадавшись, что она делает. В python я тоже чайник, поэтому не уверен, что выполнил все условности (соглашения об оформлении) в наименовании переменных, в пробелах до и после открывающей скобки, перед закрывающей и т.п.

subprocess был выбран, чтобы подавить вывод в stdout и перехватить его. Не знаю, может имеются и альтернативы, но subprocess нагуглился быстрее

Обе команды затолкать в один subprocess.Popen (как в примере на perl) не получилось, так как в переменную запихивался весь вывод первой команды.

Самое значимое для меня после 2-х часов ночных экспериментов было то, что функция работает….
py.user.next
aleko_s
  
cmd2 = "sed -e '/HIDIdleTime/ !{ d' -e 't' -e '}' -e 's/.* = //g' -e 'q'"
Опять к этой -e прицепились по незнанию
 sed '/HIDIdleTime/ !{ d; t }; s/.* = //g; q'
На всех форумах пишут незнайки это -e, где надо и где не надо.
Для изучения sed'а заходи на сайт http://sed.sourceforge.net/
aleko_s
Спасибо! Буду знать. Оказывается, это stream editor. Век живи - век учись
python335
time.ctime()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB