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

スクリプト自体がhttp://docs.python.org/2/library/atexit.htmlを使用できるため、終了した場合は終了しますatexit

オペレーティングシステムが原因で「ユーザーがアクティブになっていない期間が経過した後」にサスペンドしている場合、以前にその問題に直面したことがあり、モジュール xlib を使用してマウスを制御し、マウスをランダムにアクティブにしました

それ以外の場合は、OS 構成に適したものを把握する必要があると思います

うまくいけば、私はあなたが疑問に思ったことに答えました

于 2013-06-12T08:55:12.110 に答える
0

プログラムを長時間「アイドル状態」にした後にプログラムが一時停止するのを防ぎたい場合、マウストリックは Windows でも機能するようです。ただし、OSがスリープ状態になり、そのように一時停止するのを防ぐようには見えません:(マウス移動の概念を使用した非同期Windowsソリューションは次のとおりです。

KeepActiveThreadこれらのオブジェクトの 1 つを作成し、実行時間が非常に長いプロセスがある場合は、必要に応じて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 に答える