2

指定された時間 (「commandTime」) にシステム コマンドを実行し、その後指定された時間 (「stopTime」) に終了するために使用する小さなスクリプトがあります。ただし、スクリプトを実行すると、多くの場合、「if」ステートメントの下でコマンドが実行されません。(実行される場合と実行されない場合があります。)

私が完全なばかではなく (陪審はまだそれについては不明です...)、時間変数を適切に設定していると仮定すると、スクリプトは、'time.mktime(time.localtime()) ' は、フォーマットされた 'commandTime' 変数以上です。


問題のコードの抜粋を次に示します。

import time

commandTime = time.strptime('2013-03-01 05:00:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-01 05:10:00', "%Y-%m-%d %H:%M:%S")


while (time.mktime(time.localtime()) <= time.mktime(stopTime)):
 if (time.mktime(time.localtime()) >= time.mktime(commandTime)):
  print "Green team go"
 time.sleep(100)

stopTime 変数と commandTime 変数が設定されていると仮定すると、スクリプトを実行すると次のようになります。 time.localtime() < commandTime < stopTime

スクリプトは、time.localtime() が stopTime 以上になるまで while ステートメントをループし、ループごとに if 条件をチェックする必要があります。time.localtime() が commandTime 以上になると、印刷コマンドが実行されます。

while ループと if ステートメントの両方で比較を行うために、time.mktime() を使用して datetime オブジェクトを Unix 時間 (浮動小数点数だと思います) に変換しています。

while ループは毎回確実に機能します。ほとんどの場合、実行に失敗するのは if ステートメントだけです。

Debian Squeeze 32 ビットで python 2.7.3 を実行しています。

私の質問は次のとおりです。条件が満たされたときに if ステートメントが実行されない原因となっている、このスクリプトで間違っていることは何ですか?

ありがとう!

4

3 に答える 3

0

コードは正常であることがわかりました。問題は、sleep ステートメントで指定された時間の長さと、コマンド変数と停止変数が (時間的に) どれだけ接近しているかに関連していました。

スリープを 100 秒に設定し、コマンドと停止の間の時間差を 100 秒未満に設定した場合、反復でコマンドをトリガーせず (まだ時間がないため)、100 秒待機することが可能でした ("sleeping " コマンド時間まで)、停止変数にヒットまたは超過したため、すぐにループを終了します。

助けてくれてありがとう!!

注: 私が十分に高い評判を持っていれば、オースティンの回答を +1 します。なぜなら、実際の問題にダイヤルインするために使用したのは、オースティンのよりクリーンなループ ロジックだからです。

于 2013-03-06T20:45:08.750 に答える
0

現在設定している方法は、次のようになっています: commandTime <= time.localtime() <= stopTime

あなたがそれを望んでいると言った方法(localtime < commandtime < stoptime)にしたい場合は、次のことを行う必要があります。

import time

commandTime = time.strptime('2013-03-05 21:40:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-05 21:50:00', "%Y-%m-%d %H:%M:%S")


while (time.mktime(time.localtime()) <= time.mktime(stopTime)):
  if (time.mktime(time.localtime()) <= time.mktime(commandTime)):
    print ("Green team go")
  time.sleep(100)

実行したい方法を誤って印刷し、実際に commandTime <= time.localtime() <= stopTime が必要な場合は、Windows の python 3.2 でこの方法を試しました (印刷を関数に変更し、ローカル時間を挿入しました)また、commandTime 変数と stopTime 変数が適切に設定されていれば動作するため、Python 2.7 または Debian Squeeze と関係があるはずです。

import time

commandTime = time.strptime('2013-03-05 21:40:00', "%Y-%m-%d %H:%M:%S")
stopTime = time.strptime('2013-03-05 21:50:00', "%Y-%m-%d %H:%M:%S")


while (time.mktime(time.localtime()) <= time.mktime(stopTime)):
  if (time.mktime(time.localtime()) >= time.mktime(commandTime)):
    print ("Green team go")
  time.sleep(100)
于 2013-03-06T02:47:27.323 に答える