HOWTO · Python

在 Python 中暫停程式執行

本教程介紹瞭如何在 Python 中暫停程式。

本頁內容

若要暫停 Python 程式,請依需求選擇方式:需要定時延遲時使用 time.sleep();要等待使用者在主控台輸入時使用 input();若要讓一個執行緒等待、同時讓另一個執行緒繼續工作,則使用 threading。Shell 暫停命令僅適用於 Windows 主控台,不具跨平台相容性。

使用 time.sleep() 暫停固定時間

匯入 time 模組,並呼叫 time.sleep(seconds),即可讓呼叫它的執行緒暫停指定時間;時間以秒為單位。等待結束後,程式會繼續執行下一個陳述式。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import time

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

指定的時間並非精確的計時保證。作業系統可能會比指定時間更晚才讓執行緒恢復,因此這種方式適合用來延遲,不適合精確排程。執行緒休眠期間無法處理自己的工作,但其他執行緒仍可繼續執行。

使用 input() 等待使用者輸入

當主控台程式需要等待使用者操作時,可以使用 input()。它會顯示選用的提示文字、讀取一行輸入,並傳回輸入的文字。如果只需等待任何回應(例如按下 Enter)即可繼續,呼叫時不必指定回傳值。以下範例會處理輸入結束(EOF),因此即使在沒有互動式主控台的情況下執行,也能正常結束。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

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

如果程式需要使用回應,請儲存 input() 傳回的字串,並在程式中使用。這個範例也會處理輸入結束(EOF);重新導向輸入或沒有可用的主控台輸入時,可能會發生這種情況。

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

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

input() 會等待一行主控台輸入;它不適合用來一般性地暫停背景服務或圖形應用程式的事件迴圈。

建立可重複使用的定時暫停函式

如果程式需要重複延遲,可以將呼叫包在簡短的輔助函式中。在同一個程式檔匯入 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.")

如果程式的其他部分需要等待某項工作完成,請使用執行緒協調機制。若要無限期等待協調事件,應使用事件(event)等同步原語,而不是任意設定很長的休眠時間;休眠只能等到指定時間後再檢查。

僅在 Windows 主控台使用 os.system(“pause”)

在 Windows 上,os.system("pause") 會要求命令處理器執行 pause 命令。這種方式依賴 Windows 主控台與外部 Shell,不適合當作可跨平台的 Python 暫停方法;沒有連接主控台時,行為也可能不如預期。要顯示主控台提示時,優先使用 input();要協調工作時,則使用 threading 同步原語。這個平台限定的呼叫以行內程式碼呈現,因為它無法在所有環境中執行。

選擇合適的暫停方式

  • 程式需要延遲一段已知時間時,使用 time.sleep(seconds)。
  • 需要由使用者決定主控台程式何時繼續時,使用 input()。
  • 一個執行緒需要等待另一個執行緒或訊號時,使用 threading 同步機制。
  • 只有在 Windows 主控台程式明確需要該 Shell 命令時,才使用 os.system("pause")。

這些方式暫停的對象各不相同:定時延遲會暫停呼叫它的執行緒;主控台輸入會等待使用者輸入一行文字;同步機制則會等待並行程式的其他部分。請依照需要恢復執行的部分,以及程式是否必須支援多種平台來選擇。