我想编写一个脚本来在后台进行繁重的网络上传。 但是,我希望它在我使用计算机时暂停(通过检测网络活动或键盘活动或我没有闲置)。
在Unix上用Python检测我正在使用计算机的最佳方法是什么?
答案 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_mtime
或os.fstat(1).st_mtime
会返回tty / pty设备的上次输入时间。
答案 3 :(得分:0)
在您的计算机上粘贴一个网络摄像头,每5秒抓一次图像,然后有一些用于图像分析的python模块可以检查您是否仍然坐在座位上。
或者将微型开关连接到您的座椅上,将其连接到您的PC串口(或其中一个现代USB端口)并从Python中读取......
答案 4 :(得分:0)
导入this脚本。当像Firefox这样的另一个应用程序开始占用带宽时,暂停主程序。有一些简单的附加项目,但除此之外它很容易