В Python на Unix определить, использую ли я компьютер?или простаивает? - PullRequest
8 голосов
/ 06 мая 2011

Я хотел бы написать сценарий для интенсивной сетевой загрузки в фоновом режиме.Тем не менее, я хотел бы сделать паузу, когда я использую свой компьютер (либо обнаруживая сетевую активность, либо активность на клавиатуре, либо что я не бездействую).

Как лучше всего определить, что я использую компьютер, на Python под Unix?

Ответы [ 5 ]

10 голосов
/ 06 мая 2011

Unixy решение с использованием X11 / XScreenSaver для простоя:

#!/usr/bin/python
import ctypes
import os

class XScreenSaverInfo( ctypes.Structure):
  """ typedef struct { ... } XScreenSaverInfo; """
  _fields_ = [('window',      ctypes.c_ulong), # screen saver window
              ('state',       ctypes.c_int),   # off,on,disabled
              ('kind',        ctypes.c_int),   # blanked,internal,external
              ('since',       ctypes.c_ulong), # milliseconds
              ('idle',        ctypes.c_ulong), # milliseconds
              ('event_mask',  ctypes.c_ulong)] # events

xlib = ctypes.cdll.LoadLibrary('libX11.so')
display = xlib.XOpenDisplay(os.environ['DISPLAY'])
xss = ctypes.cdll.LoadLibrary('libXss.so.1')
xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo)
xssinfo = xss.XScreenSaverAllocInfo()
xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), xssinfo)
idletime = xssinfo.contents.idle

# Cleaning Up
xss.XFree(xssinfo)
xss.XCloseDisplay(display)

print "idle: %d ms" % idletime

(См. X11 простое и сфокусированное окно в Python .)

Редактировать Раздел очистки, добавленный в приведенном выше коде, чтобы его можно было периодически вызывать из функции, поскольку, если очистка не выполняется, в xDisplay может возникнуть ошибка из-за не закрытого отображения, которое можно найти по этой ссылке 1011 *

2 голосов
/ 06 мая 2011

Полагаю, вы обеспокоены сетевой активностью передачи файлов, мешающей интерактивному пользователю. Вам не нужно беспокоиться о том, печатает ли пользователь на клавиатуре. На самом деле все, что имеет значение, - это наличие конкурирующих сетевых действий.

Например, в Windows вы можете использовать Фоновая интеллектуальная служба передачи . Это тот же сервис, который используется Центром обновления Windows для доставки обновлений на ваш рабочий стол, не мешая использованию компьютера. Чтобы написать его, вы можете рассмотреть Powershell . Если вы не можете использовать Python, вы можете сделать это с помощью win32com.bits.

Другие платформы, без сомнения, будут иметь аналогичные предложения.

1 голос
/ 06 мая 2011

Большинство дистрибутивов Linux поставляются с ConsoleKit, который предоставляет некоторую информацию о сеансе через DBus, включая «idle hint» ;это работает как для X11, так и для текстовых входов в систему.

(Тем не менее, планирует отказаться от ConsoleKit , перенеся его части в systemd ; будущее для "простоя«Подсказка» еще не определена.)


Просто для полноты os.stat(ttydev).st_mtime или os.fstat(1).st_mtime возвращает время последнего ввода для устройств tty / pty.

0 голосов
/ 06 мая 2011

import это скрипт. Когда другое приложение, такое как firefox, начинает захватывать полосу пропускания, приостановите основную программу. Есть несколько простых добавок, но кроме этого это довольно просто

0 голосов
/ 06 мая 2011

Подключите веб-камеру к вашему компьютеру, которая захватывает изображение каждые пять секунд, а затем есть несколько модулей Python для анализа изображений, которые могут проверить, если вы все еще сидите на своем месте.

Или подключите микропереключатель к вашему креслу, подключите его к последовательному порту вашего ПК (или одному из этих современных USB-портов) и считайте его с Python ...

...