3

スケジュールされたイベントによって呼び出される関数から返される値を取得したいと考えています。以下は、私がやりたいことの簡単な例です。

import time
import sched

schedule = sched.scheduler(time.time, time.sleep)

def ret_this():
    return "This."

def schedthis():
    schedule.enter(2,1,ret_this, ())
    schedule.run()
    ## <- print returned value here

if __name__ == "__main__":
    schedthis()

私は次のような多くのことを試しました:

     schedule.enter(2,1,print ret_this, ())

あるいは:

    schedule.enter(2,1,ret = ret_this, ())
    schedule.run()
    print ret


たぶん、いくつかの背景が必要になるでしょう。

着信接続をリッスンするサーバーを作成したいと思います (これは完了です)。接続が確立されると、新しいスレッドが生成され、ソケットがそのスレッドに解析されます。そのスレッドでは、サーバーに送信された値が読み取られ、サーバーはクライアントが何をスケジュールしようとしているのかを判断します。クライアントが何を望んでいるかをサーバーが認識すると、サーバーはそれをスケジュールします。

ユーザーがスケジュールされたイベントが完了した後に情報を表示したい場合 (この回答が入って​​くる場所)、イベントが終了するまで待機し、返された値をクライアントに送信します。

そうでない場合、イベントはスケジュールされ、クライアントは「Done, farewell.」を受け取ります。接続が閉じます。

私はプログラミングの神様と呼んでいます。助けてください。

4

1 に答える 1

2

問題は実際には非常に単純です。関数から何かを返してret_thisいますが、それをどこにも置いておらず、印刷もしていません!

編集
こちらをご覧ください

以前に投稿したコードは、スケジューラによって実行されたときではなく、関数のみを実行することがわかりました。scheduler.run関数が返す値を実際に気にせずに関数を実行するだけなので、いつ呼び出されたかを実際に知るためにどこかに保存する必要があります。

たとえば、グローバル変数では次のようになります。

def ret_this():
    global result
    result = "I'm called!"

または、次の場所から印刷してret_thisください。

def ret_this():
    print "This."

編集 2
保存するもう 1 つの方法は、ファイルに書き込むことです。後でもう一度読むことができます:

def ret_this():
    with open('output.txt', 'w') as f:
        f.write('I am called!')

if __name__ = "__main__":
    schedthis()
    with open("output.txt", 'r') as f:
        print(f.read())

実行が成功した場合、ファイルにはI am called!. それ以外の場合は、空になります。

お役に立てれば!

于 2013-10-30T10:40:31.737 に答える