4

我有一个 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 模块,这是一个可以安装的低级 python 库sudo aptitude install python-xlib。我添加了几行代码来移动鼠标指针以防止挂起或休眠,这样我的脚本仍然可以在盖子关闭且没有来自任何地方的输入的情况下工作。

    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 给了我移动指针以防止挂起的想法。

4

4 回答 4

1

即使在睡眠模式 S1(我认为您的“暂停”)下,CPU 也会停止执行指令。所以您的程序不再运行 - 因此无法唤醒您的计算机......

您当然必须探索其他方法,例如配置实时时钟(在睡眠时仍处于供电状态)以唤醒计算机。在嵌入式系统上,您还可以访问可能(错过)用于该目的的硬件看门狗。不知道这在PC上是否可用。

于 2013-06-12T07:56:39.447 回答
1

如果脚本本身终止,您可以使用atexit http://docs.python.org/2/library/atexit.html

如果由于操作系统而暂停“在用户未激活的一段时间后”我之前遇到过这个问题,然后我使用模块 xlib 来控制我的鼠标将其随机移动到它将处于活动状态

否则我认为你必须找出正确的操作系统配置

希望我已经回答了您的疑问

于 2013-06-12T08:55:12.110 回答
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                    
于 2016-07-27T19:31:21.373 回答
0

我推荐使用 ctypes:

import ctypes
ES_CONTINUOUS = 0x80000000
ES_SYSTEM_REQUIRED = 0x00000001
ctypes.windll.kernel32.SetThreadExecutionState(
            ES_CONTINUOUS | \
            ES_SYSTEM_REQUIRED)
于 2019-05-07T03:22:47.570 回答