在Unix上的Python中,确定我是否正在使用我的计算机?还是闲着?

时间:2011-05-06 16:40:47

标签: python networking keyboard python-idle

我想编写一个脚本来在后台进行繁重的网络上传。 但是,我希望它在我使用计算机时暂停(通过检测网络活动或键盘活动或我没有闲置)。

在Unix上用Python检测我正在使用计算机的最佳方法是什么?

5 个答案:

答案 0 :(得分:10)

使用X11 / XScreenSaver获取空闲时间的Unixy解决方案:

#!/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 idle time and focused window in Python。)

修改 在上面的代码中添加了一个清理部分,以便可以定期从函数中调用它,因为如果没有提供清理,则xDisplay可能会因为未关闭显示而发生错误,因为可以在link上找到

答案 1 :(得分:2)

我猜您担心文件传输的网络活动会妨碍交互式用户。您无需担心用户是否在键盘上键入内容。真正重要的是,是否存在竞争性的网络活动。

例如,在Windows上,您可以使用Background Intelligent Transfer Service。这与Windows Update用于向桌面提供更新的服务相同,而不会妨碍您使用计算机。要编写脚本,您可以考虑Powershell。如果您已经开始使用Python了,可以使用win32com.bits

毫无疑问,其他平台也会有类似的产品。

答案 2 :(得分:1)

大多数Linux发行版都附带ConsoleKit,它通过DBus提供一些会话信息,包括"idle hint";这适用于X11和文本登录。

(但是,有plans to deprecate ConsoleKit,将其移动到 systemd ;“空闲提示”功能的未来尚未确定。)


为了完整起见,os.stat(ttydev).st_mtimeos.fstat(1).st_mtime会返回tty / pty设备的上次输入时间。

答案 3 :(得分:0)

在您的计算机上粘贴一个网络摄像头,每5秒抓一次图像,然后有一些用于图像分析的python模块可以检查您是否仍然坐在座位上。

或者将微型开关连接到您的座椅上,将其连接到您的PC串口(或其中一个现代USB端口)并从Python中读取......

答案 4 :(得分:0)

导入this脚本。当像Firefox这样的另一个应用程序开始占用带宽时,暂停主程序。有一些简单的附加项目,但除此之外它很容易