【问题标题】:In Python on Unix, determine if I am using my computer? or idle?在 Unix 上的 Python 中,确定我是否正在使用我的计算机?还是闲置?
【发布时间】:2011-05-06 16:40:46
【问题描述】:

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

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

【问题讨论】:

  • 也许检查屏幕保护程序是否打开?
  • 什么操作系统?对于 Linux,谷歌搜索“linux 键盘活动”以获取各种解决方案,然后从 python 调用它们。对于 Windows...呃不知道。
  • 也许这也有帮助:ru1.sourceforge.net

标签: python networking keyboard python-idle


【解决方案1】:

使用 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 上找到的那样p>

【讨论】:

  • 您接受了一个解决方案,该解决方案告诉您用户是否正在与输入设备进行交互。但真正要烧的是网络是否繁忙。这显然是你的选择,但我觉得这很奇怪。
  • 在我的系统上你必须调用xss.XFree(xssinfo)阅读xssinfo.contents.idle,否则将被设置为0
【解决方案2】:

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

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

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

【讨论】:

  • 我很好奇 Unix 的产品是什么。
  • @Joseph - 对于 unix,setsockopt(fd, IPPROTO_IP, IP_TOS, IPTOS_MINCOST) 应该将您的网络数据标记为不如大多数其他数据重要。有关详细信息,请参阅 ip(7)socket(7)。与 nice(1)setpriority(2) 结合使用,与现有的任何交互式应用程序相比,您可以降低应用程序的优先级。
【解决方案3】:

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

(不过,有plans to deprecate ConsoleKit,将其部分移入systemd;“空闲提示”功能的未来尚未确定。)


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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 这如何解决这个问题!?
    • @André:如果网络摄像头输出包含人形面孔,则“活动”;否则,“空闲”。
    • 对不起,我忘了堆栈溢出没有幽默感。
    • 它确实有幽默感,如果你发表评论
    【解决方案5】:

    导入this 脚本。当另一个应用程序(如 Firefox)开始占用带宽时,暂停主程序。有一些简单的加法,但除此之外很容易

    【讨论】:

    • 我认为挑战在于检测另一个应用程序是否需要带宽。您对此有何建议?
    • 我的网络很糟糕,但他不能定义一个类来计算数据包,平均速率,然后在达到预定义的偏离标准时暂停吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2022-11-04
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2012-12-26
    • 2019-02-26
    相关资源
    最近更新 更多