我有一个python闹钟脚本,需要在某个时间唤醒我。当我上床睡觉并让它继续运行时,我使用的具有Linux Mint的笔记本电脑在一段时间不活动后暂停。我怎么能阻止我的脚本停止并保持运行?我的笔记本电脑在我的房间里,我需要关上它的盖子,因为它的光线很难入睡。这是我的剧本。
import time
import sys
import webbrowser
alarm_HH = raw_input("Enter the hour you want to wake up at\n")
alarm_MM = raw_input("Enter the minute you want to wake up at\n")
print("You want to wake up at ", alarm_HH)
while True:
now = time.localtime()
if now.tm_hour == int(alarm_HH) and now.tm_min == int(alarm_MM):
webbrowser.open_new_tab("http://www.repeatmyvids.com/watch?v=SXLplRtMNfg&kmdom=youtube")
break
else:
timeout = 60 - now.tm_sec
if raw_input("Want me to stop?"):
break
[编辑]
好的,我想出来了。我安装了python xlib模块,这是一个可以用sudo aptitude install python-xlib
安装的低级python库。我添加了几行代码来移动鼠标指针以防止暂停或睡眠,这样我的脚本仍可以关闭盖子而无法从任何地方输入。
d = display.Display()
s = d.screen()
root = s.root
root.warp_pointer(500,500)
d.sync()
我添加了其中的一些,现在代码看起来像这样。
import time
import sys
import webbrowser
from Xlib import X, display
alarm_HH = input("Enter the hour you want to wake up at\n")
alarm_MM = input("Enter the minute you want to wake up at\n")
print("You want to wake up at ", alarm_HH)
while True:
now = time.localtime()
if now.tm_hour == int(alarm_HH) and now.tm_min == int(alarm_MM):
webbrowser.open_new_tab("http://www.repeatmyvids.com/watch?v=SXLplRtMNfg&kmdom=youtube")
break
else:
d = display.Display()
s = d.screen()
root = s.root
root.warp_pointer(500,500)
d.sync()
time.sleep( 5 )
root.warp_pointer(250,250)
d.sync()
time.sleep( 5 )
root.warp_pointer(100,100)
d.sync()
time.sleep( 5 )
root.warp_pointer(250,250)
d.sync()
感谢EngHamoud给我移动指针的想法,以防止暂停。
答案 0 :(得分:1)
atexit
而终止http://docs.python.org/2/library/atexit.html
如果由于操作系统暂停,“在用户未激活的一段时间后”我遇到了这个问题,之前我已经使用模块xlib控制我的鼠标随机移动到它将活跃
否则我认为你必须弄清楚你的操作系统配置是否正确
希望我已经回答了你想知道的事情
答案 1 :(得分:0)
即使在sleep mode S1(我认为你的“暂停”),CPU也会停止执行指令。所以你的程序不再运行 - 因此无法唤醒你的计算机......
您当然必须探索其他方法,例如配置实时时钟(仍在睡眠状态下供电)以唤醒计算机。在嵌入式系统上,您还可以访问可能(未命中)用于此目的的硬件监视程序。不知道这是否可在PC上使用。
答案 2 :(得分:0)
如果您希望在长时间“闲置”之后阻止程序暂停,那么鼠标技巧似乎也适用于Windows。它似乎并没有阻止操作系统休眠并以此方式暂停:(这是我使用鼠标移动概念的异步Windows解决方案:
创建其中一个KeepActiveThread
个对象,并在运行时间过长时根据需要调用start()
/ stop()
。
import win32api # pywin32
import thread
import time
OSCILLATION_FREQ_SECS = 30
class KeepActiveThread() :
def __init__( self ) :
self.activeId_ = None
self.resurrectId_ = None
def start( self ) :
if self.activeId_ is None :
if self.resurrectId_ is None :
self.resurrectId_ = thread.start_new_thread(
self.__oscillateMouseCursor, () )
self.activeId_ = self.resurrectId_
def stop( self ) :
self.activeId_ = None
def __oscillateMouseCursor( self ) :
move = 1
while self.activeId_ :
move *= -1
try:
(x, y) = win32api.GetCursorPos()
win32api.SetCursorPos( (x+move, y) )
except: pass
time.sleep( OSCILLATION_FREQ_SECS )
self.resurrectId_ = None
答案 3 :(得分:0)
我建议使用ctypes:
import ctypes
ES_CONTINUOUS = 0x80000000
ES_SYSTEM_REQUIRED = 0x00000001
ctypes.windll.kernel32.SetThreadExecutionState(
ES_CONTINUOUS | \
ES_SYSTEM_REQUIRED)