2013-03-06 2 views
2

작은 스크립트가 있는데 지정된 시간 ("commandTime")에 시스템 명령을 실행 한 다음 나중에 지정된 시간 ("stopTime")을 종료하는 데 사용하려고했습니다. . 그러나 스크립트를 실행할 때 "if"문 아래에서 명령을 실행하지 않습니다. (때로는 실행되고 때로는 실행되지 않을 것입니다.)if 문에서 Python이 time.mktime 조건에서 실행되지 않음

나는 총 바보가 아니며 (배심원은 여전히 ​​그 ...) 시간 변수를 합리적으로 설정하고 있다고 가정하고, 스크립트는 print 명령을 실행해야합니다 'time.mktime (time.localtime())'이 형식화 된 'commandTime'변수보다 크거나 같으면 if 문 내부에 있습니다.

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()이 다음과 같을 때까지 while 문을 반복해야합니다. stopTime보다 크거나, 각 루프의 if 조건을 점검하십시오. time.localtime()이 commandTime보다 크거나 같으면 print 명령을 실행해야합니다.

while 루프와 if 문 모두에서 time.mktime()을 사용하여 datetime 객체를 Unix 시간 (생각하는 float)으로 변환합니다.

while 루프는 항상 매번 안정적으로 작동하며 대부분의 시간을 실행하지 않는 것은 if 문뿐입니다.

데비안 스퀴즈 32 비트에서 파이썬 2.7.3을 실행 중입니다.

내 질문은 다음과 같습니다. 조건이 충족 될 때 if 문을 실행하지 못하게하는이 스크립트에서 나는 무엇을 잘못하고 있습니까?

감사합니다.

답변

0
당신이 현재 설정 한 방법은 다음 중 하나에 해당하고있다

: commandTime < = time.localtime() 당신이 당신이 말한 한 방법이 될하려면 <이

당신이 그것을 원하는 stopTime =을 (의 현지 < 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, I Windows에서 파이썬 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) 
+0

저는이 문제를 Windows에서 2.7.3 버전에서 시도해 보았습니다. 또한 명령 시간에 맞는 날짜를 설정했는지 확인하십시오 (예 : 2013-05-03) –

+0

정확합니다. Nolan, 내가 붙여 넣은 코드는 정확하지만 잘못 입력했습니다. 당신은 비교가 정확합니다 : commandTime <= time.localtime() <= stopTime. – spacestout

0

일반적으로 게시 된 코드는 ok로 표시됩니다. time.localtime()을 호출하면 whileif 루프에 대해 다른 결과가 반환됩니다.실제 코드에서 i f와 while 사이의 장기 실행 작업이 있고 시작/정지 시간이 서로 가깝다면 while이 떨어지는 경우가 있지만 if 실행 시간이 이동하기 전에있을 수 있습니다. 테스트가 실패 할만큼 충분히 멀리.

다음과 같이 작성할 수 있습니다. 이렇게하면 현재 시간을 비교 목적으로 캐시하고 (nowSec) 각 루프에서 값 비싼 시간 변환을 피할 수 있습니다.

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") 

commandTimeSec = time.mktime(commandTime) 
stopTimeSec = time.mktime(stopTime) 

while True: 
    nowSec = time.mktime(time.localtime()) 

    if nowSec > stopTimeSec: 
     break 

    if nowSec >= commandTimeSec: 
     print "Green team go" 
    time.sleep(100) 
+0

감사합니다. 오스틴, if와 while 사이에 많은 일이 일어나지는 않지만, 아침에 제안 된 형식을 확실히 테스트하여 다르게 작동하는지 확인합니다. – spacestout

0

문제는 얼마나 가까이 함께 (시간) 명령 및 정지 변수와 결합 된 수면 문에 지정된 기간과 연관이 있었다, 코드가 괜찮다고 밝혀졌습니다.

sleep을 100 초로 설정했지만 명령과 중지 사이의 시간차를 100 초 미만으로 설정하면 반복하지 않아도 명령이 실행되지 않을 수 있습니다 (아직 시간이 없기 때문에). 100을 기다립니다. 초 (명령 시간을 통해 "잠자기")를 기록한 다음 정지 변수를 초과했거나 초과했기 때문에 루프를 즉시 종료합니다.

도움을 주셔서 감사합니다.

참고 : 내가 충분히 높은 평판을 얻은 경우, 실제 문제에 전화를 걸던 그의 클리너 루프 논리이므로 Austin의 대답을 +1 할 것입니다.

관련 문제