subprocess
是 Python 標準庫中的一個模組,用來啟動子進程(例如執行外部程式或其他 Python 腳本)。在這篇教學中,我們將聚焦於 subprocess.Popen()
的實際應用,並結合執行 Python 腳本的情境進行說明。
📌 為什麼使用 subprocess.Popen()
?
- 需要非同步執行外部命令(不會卡住主程式)
- 可以細緻控制標準輸入(stdin)、輸出(stdout)、錯誤(stderr)
- 適合進階用途(例如啟動多個子程式、管理子進程輸入輸出)
🧠 基本語法
import subprocess
p = subprocess.Popen(
cmd, # 要執行的命令(list 或 str)
stdout=subprocess.PIPE, # 接收標準輸出
stderr=subprocess.PIPE, # 接收錯誤輸出
stdin=subprocess.PIPE, # 可提供輸入
text=True, # 輸出為文字格式(Python 3.7+)
shell=False # 是否用 shell 執行
)
📁 執行 Python 檔案的基本範例
假設你有一個 test_script.py
:
# test_script.py你可以用
print("Hello from test_script!")
subprocess.Popen()
來執行它:import subprocess
cmd = ["python", "test_script.py"]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print("Output:", stdout)
print("Errors:", stderr)
🕹️ 常見應用情境
✅ 1. 執行另一個 Python 腳本並取得輸出
cmd = ["python", "other_script.py", "--arg1", "value1"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = p.communicate()
if p.returncode == 0:
print("執行成功:", stdout)
else:
print("錯誤發生:", stderr)
✅ 2. 非同步執行(不等他跑完)
p = subprocess.Popen(["python", "long_task.py"])
print("主程式繼續執行,不等 long_task.py 結束")
✅ 3. 非同步 + 監控狀態
import time
p = subprocess.Popen(["python", "long_task.py"])
while p.poll() is None:
print("子程式還在跑...")
time.sleep(1)
print("子程式結束,return code:", p.returncode)