質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

1時間後にループを抜けるには

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 200

minagann

score 8

前提・実現したいこと

プログラムを起動してからリアルタイムで1時間後に終了(whileループを抜ける)させたいです

発生している問題・エラーメッセージ

[error] script [ aaaaaaaaaa ] stopped with error in line 6
[error] TypeError ( can't compare 'timedelta' to 'int' )
[error] --- Traceback --- error source first
line: module ( function ) statement 
729: datetime (  __gt__ )   File "C:\Users\titou\AppData\Roaming\Sikulix\Extensions\jython-standalone-2.7.1.jar\Lib\datetime.py", line 390, in _cmperror
6: main (  <module> )     while elapsed_time < t1:
[error] --- Traceback --- end --------------

該当のソースコード

import datetime

start = datetime.datetime.now()
t1 = datetime.timedelta(hours=1)
elapsed_time = 0
while elapsed_time < t1
  ~~1時間後に終わらせたい処理~~
    end = datetime.datetime.now()
    elapsed_time = end - start
    print(u"経過時間:{elapsed_time}")

試したこと

思いついたのは
「start」と「end」の変数を作り
startに開始時刻をendに1ループ分の終了時刻を入れ
終了時刻から開始時刻を引いて残った経過時間(elapsed_time)が
t1(1時間後の時間)を過ぎていれば抜けるという考えたのですがどうにも
エラーが出てうまく回りません…

補足情報(FW/ツールのバージョンなど)

sikulix 2.0.4
•Python language level 2.7 (supported by Jython)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • q_sane_q

    2020/07/23 11:09

    これループは必須なのでしょうか?

    一定時間止めるだけなら
    time.sleep
    で止められると思いますがどうでしょうか

    キャンセル

  • minagann

    2020/07/23 11:13

    q_sane_q さん
    sleepだと処理そのものが止まってしまいますよね?多分
    自分は「やりたいを処理を開始~1時間後までの間ループしてやり続けさせる」というところがメインなのでやりたい処理が止まってしまうと困ります

    キャンセル

  • minagann

    2020/07/23 11:14

    わかりにくいテキスト入れてしまったので申し訳ないです

    キャンセル

回答 3

checkベストアンサー

0

end=time.time() + (60 * 60)
while time.time() < end :
    time.sleep(1)
    print('do')

どんな処理か知らないけどthreadingを検討した方が良いと思う

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/23 11:32

    やりたい処理が出来たのでこちらをベストアンサーにします!
    ありがとうございました。あとthreading調べてみます

    キャンセル

0

while elapsed_time < t1

elapsed_timeという変数は(実行時点では)存在してません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/23 10:58

    すいません貼るコード間違えてました
    elapsed_time = 0と変数を作ったうえでの記載したエラーになります

    キャンセル

0

概ねちゃんとできてますが、細かいところが全然です。

import datetime

start = datetime.datetime.now()
t1 = datetime.timedelta(hours=1)
end = datetime.datetime.now()
elapsed_time = end - start
while elapsed_time < t1:
    処理
    end = datetime.datetime.now()
    elapsed_time = end - start
    print(f"経過時間:{elapsed_time}")


whileのコロンが無い
elapsed_time の初期化がおかしい
f"~~"

同じ処理を2回書かないためには、

import datetime

start = datetime.datetime.now()
t1 = datetime.timedelta(hours=1)
while True:
    処理
    end = datetime.datetime.now()
    elapsed_time = end - start
    print(f"経過時間:{elapsed_time}")
    if elapsed_time >= t1:
        break

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/04 10:56

    遅れての質問になるんですが
    参考に書いていただきました2個目のコードを試したところ
    [error] script [ aaaaaaaaaa ] stopped with error at line --unknown--
    [error] Error caused by: java.lang.IllegalArgumentException: Cannot create PyString with non-byte value

    とエラーが出てしまい原因は「f"経過時間:」この部分だったので一度「keika:」とし実行したところ
    printの部分が「keika:{elapsed_time}」表示されてしまい正常に差分の時間が表記されなかったです
    strftime(): 日付、時間から文字列への変換が必要なのかと思い

    print("keika:",elapsed_time.strftime('%Y-%m-%d %H:%M:%S'))
    などいろいろ試しましたがうまく表示されませんでした・・・
    理想は「経過時間:'%H:%M:%S'」ですが最悪%H:%M:%Sは欲しいです

    キャンセル

  • 2020/08/04 10:59 編集

    丸投げになってしまう内容だと思いますがいろんな記述法学ぶ一つとして
    この問題は解決しておきたいです

    追記
    すいませんprint("keika:" + str(elapsed_time))とすることで大方希望通りになりました
    文字化けの対策して経過時間と日本語を表記できれば実行できそうです

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る