0
# run infinitly
while(True):

  done = False;

  while(not done):
    #Do Stuff
    #Main Program

    #stopping condition of inner while loop
    if datetime.datetime.now().minute == 10:
      done = True
       if datetime.datetime.now().minute == 10:
          time.sleep(60-datetime.datetime.now().second)

なぜこれがうまくいかないのかわかりません。スクリプト全体が無限ループで実行され、10 分ごとに停止条件が満たされるまで内側のループが実行されることになっています。

そのような if ループで行ったように datetime.datetime.now().minute を使用すると、10 分ごとに done = True を設定し、ループを終了して残りを続行することが私の理解であり、おそらく私は間違っています。スクリプトの...それが別の無限ループにあり、最初からやり直すことになっていることに気付くまで。

このコマンドがどのように機能するか混乱していますか、それとも私のコードに何か問題がありますか? それとももっと良い方法がありますか?スクリプトは実行されますが、その停止条件で内側のループが終了しません。

4

5 に答える 5

4

それを行うにはさまざまな方法がありますが、元の設計に近づけるために、内側のループを次のようにコーディングします。

while(not done):
    if datetime.datetime.now().minute % 10 == 0:
        done = True
    else:
        time.sleep(60-datetime.datetime.now().second)

(その秒であなたがやろうとしていたifことは、ループを終了する準備ができていない次の分までスリープすることだったと思います。)

于 2013-06-27T20:25:26.547 に答える
1

毎時10時を過ぎているかどうかを絶えずチェックするのではなく、計算して適切に睡眠してください. 時間は一般に決定論的です。

import datetime
import time

def seconds_till_10past():
    now = datetime.datetime.now()
    delta = now.replace(minute=10, second=0) - now
    return delta.seconds % 3600

while True:
    time.sleep(seconds_till_10past())
    print "Do something at 10 past the hour."

また、引数をステートメントに括弧で括らないでください (例: while(True))。形式が正しくありません。

于 2013-06-27T20:58:09.913 に答える
1

これは質問に直接答えるものではありませんが、最初に達成したいのは、(たとえば) 10 分ごとに Python コードを実行することだけである場合は、cronを使用してこれを実装することをお勧めします。

これまでのところ、起動時に何らかの形で開始されるスクリプトがあると思います。主に、無限ループ、メイン プロシージャ、および次の実行時まで待機するコンポーネントで構成されます。たとえば、次のようにします。

""" my_first_daemon.py
    does something everytime the datetime minute part is fully divisible by ten
"""

while True:
    # do something at 00,10,20,30,40,50 (minutes) every hour
    print "Hello World!"
    # wait until the next execution time
    wait_until_next_ten_minute_time()

これが実際に当てはまる場合は、スクリプトのメイン セクションを別のスクリプトに移動することをお勧めします。たとえば、次のようにします。

""" my_first_cronjob.py
    is run by cron everytime the datetime minute part is fully divisible by ten
"""

# do something at 00,10,20,30,40,50 (minutes) every hour
print "Hello World!"

先に進み、crontab に追加します (コマンドcrontab -eを使用して、スクリプトを実行するユーザーの crontab にエントリを追加します。manpage も参照してください)。たとえば、次のようにします。

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *     command to be executed

# example entry:
# (divide minute-star by 10 to get it run every 10 minutes) 
*/10 *  *  *  *     python /path/to/my_first_cronjob.py

編集後、crontab: installation new crontabのようなメッセージが表示されたら完了です。待って、うまくいくか見てみましょう。

以下の点にも注意してください。

  • スクリプトの stdout および stderr への出力は、終了後にメールで送信されます。tail -f /var/mail/moooeeeep(ユーザー名を指定してください)をご覧ください。これらのメールを取得するように Thunderbird を構成して、検査を容易にすることもできます。
  • 対応するウィキペディアのページは、詳細について非常に優れた情報源です。
  • スクリプトの独立した実行間で状態情報を保持する必要がある場合は、構成ファイルを使用してこの状態情報を保存することを検討してください。たとえば、pickleshelvesqliteなどを使用します。
于 2013-06-29T08:01:23.603 に答える
-1

上記の私のコメントから拡張:

tic = datetime.datetime.now()

while True:

    # do stuff

    toc = datetime.datetime.now() - tic
    if toc.minute > 10:
        tic = datetime.datetime.now();
        time.sleep(60-datetime.datetime.now().second)

done" " 変数は終了の意味を伝えるため、削除しました。ただし、コードを読むと、実際には進行中のプロセスを実際に一時停止しているように見えます。

お役に立てれば!

于 2013-06-27T20:46:29.310 に答える