HOWTO · Python

Python でプログラムを一時停止

このチュートリアルでは、Python でプログラムを一時停止する方法について説明します

このページの内容

Pythonプログラムを一時停止するには、必要な動作に応じて方法を選びます。時間を指定して待つなら time.sleep()、コンソールでユーザーの入力を待つなら input()、別のスレッドが動作を続ける間に一方を待たせるなら threading を使います。シェルの一時停止コマンドはWindowsのコンソールでのみ利用でき、他の環境には移植できません。

time.sleep()で指定した時間だけ一時停止する

timeモジュールをインポートし、time.sleep(seconds)を呼び出すと、呼び出したスレッドを指定した時間だけ停止できます。時間の単位は秒です。待機が終わると、次の文から実行が再開します。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import time

print("Starting a short pause.")
time.sleep(0.1)
print("The program continues.")

指定した時間どおりに再開することが保証されるわけではありません。オペレーティングシステムの都合で、スレッドの再開が指定より遅れることがあります。そのため、正確な時刻に実行するスケジューリングではなく、単純な遅延に使ってください。スレッドがスリープしている間、そのスレッド自身は処理を行いませんが、他のスレッドは実行を続けられます。

input()でユーザー入力を待つ

コンソールプログラムでユーザーの操作を待つときは、input()を使います。任意のプロンプトを表示して1行を読み取り、入力された文字列を返します。戻り値を変数に代入せずに呼び出せば、たとえばEnterキーを押すだけでプログラムを続行できます。以下の例ではEOFも処理するため、対話型コンソールがない状態で実行しても正常に終了できます。

このセクションのコードと表示されるラベルや出力は英語のままです。

try:
    input("Press Enter to continue: ")
except EOFError:
    pass

入力内容をプログラムで使う場合は、返された文字列を変数に保存します。この例でもEOFを処理しています。EOFは、入力がリダイレクトされている場合や、コンソール入力を利用できない場合に発生することがあります。

try:
    name = input("Your name: ")
except EOFError:
    name = "guest"

print(f"Hello, {name}.")

input()が待つのはコンソールからの1行入力です。バックグラウンドサービスや、GUIアプリケーションのイベントループを一時停止するための汎用的な方法ではありません。

再利用できる時間指定の一時停止関数を作る

同じ遅延を何度も使う場合は、呼び出しを小さなヘルパー関数にまとめます。同じスクリプト内でtimeをインポートし、関数を呼び出すたびに待ちたい秒数を渡します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import time

def pause_for(seconds):
    time.sleep(seconds)

pause_for(0.1)
print("Ready.")

このヘルパーを使うと呼び出し側を簡潔にできますが、動作はtime.sleep()と同じです。つまり、呼び出したスレッドが停止します。入力値の検証やログ記録は、プログラム側でそうした方針が必要な場合に追加してください。

他の処理を続けながらスレッドを一時停止する

ワーカー関数内でスリープすると、プロセス内のすべてのスレッドではなく、そのワーカーだけが停止します。待機中もメインスレッドは別の処理を行えます。その後にjoin()を呼ぶと、ワーカーの終了を待ちます。join()自体がプロセスを一時停止したり、無関係なスレッドを止めたりするわけではありません。

このセクションのコードと表示されるラベルや出力は英語のままです。

import threading
import time

def worker():
    time.sleep(0.1)
    print("Worker finished.")

thread = threading.Thread(target=worker)
thread.start()
print("Main thread continues.")
thread.join()
print("Worker has been joined.")

プログラムの別の部分で処理の完了を待つ必要がある場合は、スレッド間の同期を使います。終了時期が決まっていない待機には、任意の長い時間スリープするのではなく、イベントなどの同期プリミティブを使ってください。スリープの場合、指定した時間が経過するまで次の確認は行われません。

Windowsコンソールでのみos.system("pause")を使う

Windowsでは、os.system("pause")を呼び出すと、コマンドプロセッサにpauseコマンドを実行させます。この方法はWindowsのコンソールと外部シェルに依存するため、Pythonで使える移植性のある一時停止方法ではありません。コンソールが接続されていない場合は、期待どおりに動作しないこともあります。コンソールで入力を促すにはinput()を、処理間の調整にはthreadingの同期プリミティブを使うのが適切です。この呼び出しは環境によって実行できないため、本文中に記載しています。

目的に合った一時停止方法を選ぶ

  • 既知の時間だけ遅らせるには、time.sleep(seconds)を使います。
  • コンソールプログラムを続行するタイミングをユーザーに決めてもらうには、input()を使います。
  • あるスレッドが別のスレッドやシグナルを待つには、threadingの同期機能を使います。
  • os.system("pause")は、そのシェルコマンドを必要とするWindowsコンソール用スクリプトに限って使います。

これらの方法で一時停止される対象はそれぞれ異なります。時間指定の遅延では呼び出したスレッドが停止し、コンソール入力ではユーザーが1行を入力するのを待ち、同期では並行プログラム内の別の処理を待ちます。何の実行を再開したいのか、また複数のプラットフォームで動かす必要があるのかに応じて選んでください。