我想用Python编写一个程序,其中的脚本在检测到它已退出睡眠模式时执行。 例如,我正在使用笔记本电脑。当我打开笔记本电脑时,脚本应该运行。有没有办法检测到这一点然后运行脚本?有没有监听此类事件的模块?
最终目标是一种安全系统,如果用户的计算机被使用,则会向用户的手机发送警报。我对警报发送部分有一个想法,我只是不知道如何首先触发该程序。
if computer_active == True:
alert.send("Computer accessed")
显然它看起来会比这更复杂,但这是总体思路。
我在 MacOSX v10.15.7 上运行 Python3.10.0
一个也许总比没有好的解决方案。它很hacky,它需要始终运行,它不是事件驱动的;但是:它很短,可配置且便携:-)
'''
Idea: write every some seconds to a file and check regularly.
It is assumed that if the time delta is too big,
the computer just woke from sleep.
'''
import time
TSFILE="/tmp/lastts"
CHECK_INTERVAL=15
CHECK_DELTA = 7
def wake_up_from_sleep():
print("Do something")
def main():
while True:
curtime = time.time()
with open(TSFILE, "w") as fd:
fd.write("%d" % curtime)
time.sleep(CHECK_INTERVAL)
with open(TSFILE, "r") as fd:
old_ts = float(fd.read())
curtime = time.time()
if old_ts + CHECK_DELTA < curtime:
wake_up_from_sleep()
if __name__ == '__main__':
main()
问题很老了,但是因为我在寻找同样的东西,但我在网上没有找到任何东西......
import win32com.client
colMonitoredEvents = win32com.client.Dispatch("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecNotificationQuery("Select * from Win32_PowerManagementEvent")
while True:
objLatestEvent = colMonitoredEvents.NextEvent()
if objLatestEvent.EventType == 7:
pass #do your stuff here
基于事件,以低CPU使用率无限期运行,并在事件ID为7时执行操作;事件 4 应在进入睡眠状态时捕获。请注意,对于事件 4,操作应该非常快,否则很可能在 PC 进入睡眠状态之前无法完成。
systemd 可以选择每次唤醒后执行一次(python)脚本。因此,您可以创建一个脚本,该脚本知道每次运行时都发生了唤醒,并且您可以从那里获取它。如果您需要通知必须始终运行的脚本,请使用进程间通信,特别是事件。请参阅 multiprocessing,特别是 SyncManager(尽管我发现 BaseManager 和传递独立的 Event 对象更容易)。