🔧解決 Python 腳本「一閃而逝」:用 PowerShell 正確執行與除錯的完整指南(含 venv、參數與 .bat 範例)
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
身為軟體工程師,我最常被朋友問到的 Windows 問題之一是:「雙擊 .py 之後視窗閃一下就消失了,怎麼辦?」
這篇文章會用非工程背景也看得懂的方式,教你在 PowerShell 正確啟動 Python 虛擬環境(venv)、以指令列參數執行腳本、避免視窗閃退、並在需要時用 .bat 批次檔一鍵執行。文中所有程式碼範例均為重新撰寫、僅用於教學示範。
為什麼會「閃退」?
-
腳本本來就需要參數:沒有帶
--source、--out這類必填參數,程式立即結束。 -
錯誤訊息來不及看:直接雙擊會開啟一個臨時視窗,程式結束就關掉。
-
工作目錄不對:雙擊時的「目前資料夾」常是
C:\Windows\System32,相對路徑全失效。 -
少套件:例如需要
pandas、openpyxl,但環境沒安裝。 -
沒用虛擬環境:系統 Python 與專案需求版本、套件不同步。
一步步正確執行(最穩妥做法)
以下假設你的專案放在:D:\Projects\ReportTool
1) 打開 PowerShell 並進到專案資料夾
cd "D:\Projects\ReportTool"
2) 啟用 venv(PowerShell 版)
虛擬環境資料夾常命名為 .venv(前面有小數點)。
.\.venv\Scripts\Activate.ps1
如果出現「執行原則限制」:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force .\.venv\Scripts\Activate.ps1
3) 安裝(或更新)必要套件
pip install -U pip pip install pandas openpyxl xlsxwriter
4) 用參數執行腳本(範例)
假設你的腳本檔叫 combine_reports.py,它需要兩個參數:來源資料夾與輸出檔案。
python -X dev -u ".\combine_reports.py" --source ".\input" --out ".\merged.xlsx"
-
-X dev:顯示更完整的除錯訊息。 -
-u:不快取輸出,讓訊息即時印出。 -
路徑有空白或中文,一律加引號。
教學用 Python 範例(全新撰寫)
這是一個「需要參數」的示範腳本,會把指定資料夾中每個 Excel 的第一個工作表合併進一個新檔。
你可以將此檔命名為 combine_reports.py 放在專案根目錄。
# combine_reports.py (教學示範用)
# 需求:pip install pandas openpyxl
from pathlib import Path
import argparse
import sys
import pandas as pd
def parse_args():
p = argparse.ArgumentParser(
description="Combine the first worksheet of all Excel files in a folder."
)
p.add_argument("--source", required=True, help="Folder that contains Excel files")
p.add_argument("--out", required=True, help="Output Excel file path")
p.add_argument("--pattern", default="*.xlsx", help="File pattern (default: *.xlsx)")
return p.parse_args()
def main():
args = parse_args()
src = Path(args.source)
if not src.exists() or not src.is_dir():
print(f"[ERROR] Source folder not found: {src}")
sys.exit(2)
files = sorted([p for p in src.glob(args.pattern) if not p.name.startswith("~$")])
if not files:
print("[WARN] No Excel files found. Nothing to do.")
sys.exit(0)
with pd.ExcelWriter(args.out, engine="openpyxl") as writer:
for f in files:
try:
df = pd.read_excel(f, sheet_name=0)
except Exception as e:
print(f"[SKIP] {f.name} ({e})")
continue
# 以檔名(去副檔名)當成工作表名稱,過長時截斷至 31 字
sheet = f.stem[:31]
df.to_excel(writer, index=False, sheet_name=sheet)
print(f"[OK] Combined {len(files)} file(s) -> {args.out}")
if __name__ == "__main__":
# 讓任何未處理的例外都能顯示在主控台
try:
main()
except Exception as ex:
import traceback
traceback.print_exc()
input("\n程式發生錯誤(已顯示堆疊訊息)。按 Enter 關閉...")
執行方式:
python ".\combine_reports.py" --source ".\input" --out ".\merged.xlsx"
一鍵執行的 .bat(避免視窗秒關)
把下面內容存成 run_combine.bat,丟在專案根目錄。雙擊執行即可,視窗會保留讓你看到訊息。
@echo off setlocal chcp 65001 >nul set "ROOT=%~dp0" set "SRC=%ROOT%input" set "OUT=%ROOT%merged.xlsx" if exist "%ROOT%.venv\Scripts\python.exe" ( "%ROOT%.venv\Scripts\python.exe" "%ROOT%combine_reports.py" --source "%SRC%" --out "%OUT%" ) else ( py -3 "%ROOT%combine_reports.py" --source "%SRC%" --out "%OUT%" ) echo. echo 任務完成,若有錯誤請往上捲動檢查訊息。 pause endlocal
常見錯誤與排除
1) …Activate.ps1 無法辨識
-
路徑或檔名打錯:請確認是
.venv\Scripts\Activate.ps1(大小寫無所謂,但.venv前面的點不能少)。 -
你在對的資料夾嗎?用
pwd檢查目前位置。
2) running scripts is disabled
-
設定允許執行本機腳本:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
3) ModuleNotFoundError(少套件)
-
在已啟用的 venv 裡安裝:
pip install pandas openpyxl xlsxwriter
4) 找不到檔案或資料夾
-
路徑含空白或中文,記得用引號:
"D:\My Data\input"。 -
先用
ls或dir確認檔案真的存在。
5) 看不到錯誤就關掉了
-
用 PowerShell 執行,不要雙擊。
-
或在程式最後加上
input("按 Enter 關閉...")。 -
或用本文提供的
.bat(含pause)。
最佳實務建議(Engineer Tips)
-
固定使用 venv:不同專案不同依賴,避免「全域地獄」。
-
參數要有
--help:像本文的argparse,讓使用者知道怎麼跑。 -
加入 log 機制:出錯時寫入
error.log方便定位。 -
明確的輸出與返回碼:例如找不到檔案回傳
exit 2,自動化流程更好接。 -
在指令前加
-X dev:開發模式訊息更完整,除錯效率高。
範例工作流程(從零到跑起來)
-
建資料夾:
D:\Projects\ReportTool -
建
input\資料夾,把要合併的 Excel 放進去 -
建立 venv 並啟動(一次性):
cd "D:\Projects\ReportTool" python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -U pip pandas openpyxl xlsxwriter -
存好
combine_reports.py -
執行:
python ".\combine_reports.py" --source ".\input" --out ".\merged.xlsx" -
想一鍵:存好
run_combine.bat,以後直接雙擊。
FAQ
Q:我沒有 .venv 這個資料夾怎麼辦?
A:在專案根目錄執行 python -m venv .venv 建一個,然後照文內步驟啟用。
Q:一定要用 PowerShell 嗎?
A:推薦。若用 CMD,啟用 venv 的指令是 .\.venv\Scripts\activate.bat。
Q:Excel 合併卡格式?
A:先確認每個檔案第一個工作表結構一致;必要時在讀入後補齊欄位或統一欄名。
結語
「視窗一閃就沒了」其實是執行方式與參數/環境沒有設定妥當。
掌握本文三件事:PowerShell 執行、venv 啟用、指令列參數,再搭配 .bat 做一鍵化,日常處理檔案或報表就能穩定又省心。
有任何步驟卡住或想擴充更多自動化(例如自動搬檔、產出多個報表),把錯誤訊息或需求貼給我,我會用工程師的方式幫你拆解解決。
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
留言
張貼留言