🔧解決 Python 腳本「一閃而逝」:用 PowerShell 正確執行與除錯的完整指南(含 venv、參數與 .bat 範例)

 身為軟體工程師,我最常被朋友問到的 Windows 問題之一是:「雙擊 .py 之後視窗閃一下就消失了,怎麼辦?」

這篇文章會用非工程背景也看得懂的方式,教你在 PowerShell 正確啟動 Python 虛擬環境(venv)、以指令列參數執行腳本、避免視窗閃退、並在需要時用 .bat 批次檔一鍵執行。文中所有程式碼範例均為重新撰寫、僅用於教學示範。


為什麼會「閃退」?

  1. 腳本本來就需要參數:沒有帶 --source--out 這類必填參數,程式立即結束。

  2. 錯誤訊息來不及看:直接雙擊會開啟一個臨時視窗,程式結束就關掉。

  3. 工作目錄不對:雙擊時的「目前資料夾」常是 C:\Windows\System32,相對路徑全失效。

  4. 少套件:例如需要 pandasopenpyxl,但環境沒安裝。

  5. 沒用虛擬環境:系統 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"

  • 先用 lsdir 確認檔案真的存在。

5) 看不到錯誤就關掉了

  • PowerShell 執行,不要雙擊。

  • 或在程式最後加上 input("按 Enter 關閉...")

  • 或用本文提供的 .bat(含 pause)。


最佳實務建議(Engineer Tips)

  • 固定使用 venv:不同專案不同依賴,避免「全域地獄」。

  • 參數要有 --help:像本文的 argparse,讓使用者知道怎麼跑。

  • 加入 log 機制:出錯時寫入 error.log 方便定位。

  • 明確的輸出與返回碼:例如找不到檔案回傳 exit 2,自動化流程更好接。

  • 在指令前加 -X dev:開發模式訊息更完整,除錯效率高。


範例工作流程(從零到跑起來)

  1. 建資料夾:D:\Projects\ReportTool

  2. input\ 資料夾,把要合併的 Excel 放進去

  3. 建立 venv 並啟動(一次性):

    cd "D:\Projects\ReportTool" python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -U pip pandas openpyxl xlsxwriter
  4. 存好 combine_reports.py

  5. 執行:

    python ".\combine_reports.py" --source ".\input" --out ".\merged.xlsx"
  6. 想一鍵:存好 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 做一鍵化,日常處理檔案或報表就能穩定又省心。

有任何步驟卡住或想擴充更多自動化(例如自動搬檔、產出多個報表),把錯誤訊息或需求貼給我,我會用工程師的方式幫你拆解解決。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題