Workiva Scripting 及 Python 3.9 支援終止
為了讓您的自動化面向未來,Workiva 將推出對 Python 3.13 的支援 ,以及讓您為每個指令碼選擇執行時間版本的指令碼層級設定。本指南說明如何安全地從 3.9 移至 3.13、測試什麼,以及如何以最小的干擾推出變更。
在2025 年 10 月 之前,Workiva Scripting 一直依賴Python 軟體基金會 官方 Python 3.9 版本,該版本目前已達生命週期結束,不再接收安全性更新或錯誤修正。
為因應這項變更,Workiva Scripting 已過渡到使用Amazon Linux 2023 (AL2023) 影像,該影像提供 Python 3.9 和 3.13 的自行建置。此變更可確保Python 3.9 透過 Amazon 的更新週期持續獲得安全修補程式 與維護,即使上游 Python 版本不再由開放原始碼社群/社區提供修補程式。
由於此轉換,Workiva Scripting 將繼續支援在Python 3.9 至2026 年 10 月 上安全執行指令碼。
誰應該考慮此遷移?目前在Python 3.9上執行 Workiva Scripting 自動化的任何人 - 無論是手動觸發程序、從 Chains(自動化鏈結)或透過「整合自動化」。
如果我什麼都不做呢?在 2026 年 10 月之前,您的指令碼仍可透過 AL2023 修補程式保持安全,但建議進行移轉,以與最新支援的執行時間 (3.13) 對齊/協調。
關於生命週期結束時間線和支援版本的更多背景資料,請審閱/審核官方Python 發行狀態網頁 。
Workiva 如何支持這項變革
Workiva 正在推出更新,讓開發人員可以控制腳本使用的 Python 執行時間。此更新將帶來以下變更:
- Python 3.13 支援 - 所有新的腳本都會預設為 Python 3.13,也就是最新的穩定版本。
- 每個腳本的執行時間設定 - 現在每個腳本都會讓您選擇腳本要使用的 Python 執行時間版本 (3.9 或 3.13)。
- 向後相容性 - 在您更新之前,所有現有的腳本都會繼續使用 Python 3.9。
- 編輯器與 API 支援 - 您將可直接在 Workiva Script 編輯器或透過 Scripting API 設定或更新執行時間。
這可確保您能依據自己的時間表進行遷移、安全測試,並只會在您確定生產指令碼已準備就緒時才切換。
此轉換的時間表
為了幫助您規劃,以下是推出時間表:
- Workiva 中可用的 Python 3.13 (2025 年 9 月) - 所有客戶均可使用 Scripting API 或 Scripting 編輯者配置指令碼以在 Python 3.9 或 Python 3.13 上執行。
- Python 3.9 生命週期結束 (2025 年 10 月) - 官方 Python 社群支援結束。Workiva 透過 AL2023 繼續提供支援至 2026 年 10 月,但強烈建議進行遷移。
- 2026 年 10 月 - Workiva 計劃在 2026 年 10 月結束對 Python 3.9 的支援,之後所有指令碼將在 Python 3.13 上執行。
您應該儘快開始在 Python 3.13 上測試指令碼,並暫時在 3.9 上進行生產。一旦您可以自如地使用 Python 3.13,請立即將您的生產指令碼轉換到 Python 3.13 運行時。
將腳本切換到 Python 3.13
我們建議的推出模式:建立副本、更新版本、測試,然後推廣。這可將生產風險降至最低,並在需要時讓您保留運行記錄。
步驟 1 - 複製一份
- 在 Workiva 中,複製您的製作腳本。
副本仍會設定為 Python 3.9。 - 將副本的執行時間設定為 Python 3.13。
步驟 2 - 測試並修改文案
- 在安全 / 測試上下文中執行副本。
- 修正任何破壞性變更 (請參閱 「常見問題與修正」)。
- 驗證輸出、副作用和效能。
步驟 3 - 變更為 3.13 (兩個選項)
選項 A - 這將保留生產運行記錄
- 透過複製貼上的方式,將副本 的更新程式碼推回原始的 腳本。
- 將原始 腳本的執行時間變更為Python 3.13 。
- 重新執行您的測試,然後恢復原始的正常排程/觸發器。
- (可選)歸檔或退役副本。
選項 B - 這將不會保留生產運行記錄
- 變更生產觸發器 (也就是 Chains 觸發器) 從原始 腳本指向複製 腳本。
- 副本 成為新的生產指令碼 (執行於Python 3.13)。
- (選項) 將原始檔案歸檔或退還。
呼籲行動: 無論您選擇哪個方案,請在 2025 年 10 月前將所有使用中的腳本移至Python 3.13 。
更新 Python 執行時版本
使用腳本 API
-
確定腳本的執行時間。
GET /v1/scripts/{script_id}檢查回應中
runtime的值。 -
更新腳本至 Python 3.13。
PATCH /v1/scripts/{script_id} Content-Type: application/json [{ "op": "replace", "path": "/runtime", "value": "python3.13" }]
如需詳細資訊,請參閱〈指令碼原型 API 文件〉。
範例:變更與讀取 Python 執行時版本
以下範例程式碼顯示如何使用 Scripting API 更新腳本的執行版本 (3.9 或 3.13),以及如何確認目前設定的版本。
import os import requests CLIENT_ID = os.environ.get("CLIENT_ID") CLIENT_SECRET = os.environ.get("CLIENT_SECRET") SCRIPT_ID = os.environ.get("SCRIPT_ID") VERSION = os.environ.get("VERSION") #VERSION = "python3.9" #VERSION = "python3.13" SCRIPTS_V1_URL = "https://api.app.wdesk.com/prototype/platform/scripts" AUTH_URL = "https://api.app.wdesk.com/iam/v1/oauth2/token" def change_version(clientId, clientSecret, scriptId, version): auth_header = get_auth_header(clientId, clientSecret) # Change Python Version req_body = [ { "op": "replace", "path": "/runtime", "value": version } ] resp = requests.patch( f"{SCRIPTS_V1_URL}/{scriptId}", json=req_body, headers=auth_header ) name = resp.json().get("name") new_version = resp.json().get("runtime") print("Python version for '" + name + "' script changed to: " + new_version.replace("python", "")) def read_version(client_id, client_secret): auth_header = get_auth_header(client_id, client_secret) # read Python Version resp = requests.get( f"{SCRIPTS_V1_URL}/{SCRIPT_ID}", headers=auth_header ) name = resp.json().get("name") configured_version = resp.json().get("runtime") print("Python version for '" + name + "' script: " + configured_version.replace("python", "")) # Fetches the auth headers for a given client id and secret def get_auth_header(client_id, client_secret): token_headers = {"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"} data_field = ( f"client_id={client_id}&client_secret={client_secret}" f"&grant_type=client_credentials" ) auth_resp = requests.post(f"{AUTH_URL}", data=data_field, headers=token_headers) auth_json = auth_resp.json() bearer_token = "Bearer " + auth_json.get("access_token") return {"Authorization": bearer_token} change_version(CLIENT_ID, CLIENT_SECRET, SCRIPT_ID, VERSION) #read_version(CLIENT_ID, CLIENT_SECRET)使用腳本編輯器
有了指令碼編輯器,您就可以直接在使用者介面中設定執行時間。在Properties → Runtime Version 下有一個新的下拉式選單,您可以在 Python 3.9 和 Python 3.13 之間選擇。
若要更新編輯器中的指令碼,請
- 在Scripting Editor 中開啟指令碼。
- 移至右側屬性面板。
- 在Runtime Version 下,從下拉式選單中選擇Python 3.13 。
- 儲存您的變更。
- 在安全/測試環境中執行腳本,然後再推廣到生產環境。
提示
- 確保您腳本中的任何第三方套件與 Python 3.13 相容。
- 更新
requirements.txt檔案中任何固定的套件版本 (例如,與 Python 3.9 不同,requests==2.28在 3.13 中不需要)。 - 請閱讀官方 Python 文件,以瞭解有關 Python 版本的主要變更的詳細資訊3.10,3.11,3.12, 以及3.13, 包括:
- 結構模式匹配、f 字串更新、改進錯誤訊息
- 效能大幅提升(函式呼叫、字串操作、記憶體管理、JSON 序列化/解序列化)
- 套件與特定套件參數的棄用與移除 (例如
cgi、cgitb、distutils等已被棄用;asyncio的「loop」參數已被移除)
從 3.9 移至 3.13 的常見遷移問題與修正
以下是當您將腳本從 Python 3.9 移動到 3.13 時可能會遇到的一些常見問題,以及建議的修正方法:
- 第三方函式庫 - 某些套件可能尚未支援 Python 3.13。
- 修復: 升級至最新的相容版本,或以其他版本取代。仔細測試任何釘住的需求。您可以在pyreadiness.org/3.13 檢查您的函式庫是否支援,並檢閱 「支援的指令碼函式庫與相依性 」 說明文章,以取得更多資訊。
- 請求函式庫版本 -
請求函式庫是 Workiva Scripting 中最常見的第三方函式庫。在 Python 3.9 的早期版本中,指令碼會在要求者版本 2.30.0 或更新版本時分解/中斷。一旦您移植到 Python 3.13,您就可以使用最新版本的requests而不會有問題。 - Python 3.13 在字串和位元組的處理上有差異 - 更嚴格的類型檢查可以讓隱藏的問題浮現出來。
- 修正: 檢查混合
str和bytes的程式碼,並確保明確的編碼/解碼。
- 修正: 檢查混合
- 日期時間與時區行為 - Python 3.13 在
zoneinfo函式庫與更嚴格的解析上有差異。- 修正: 測試所有日期/時間邏輯,特別是格式化和時區轉換。
- JSON 序列化 - 某些物件可能會因為更嚴格的規則而無法序列化。
- 修正: 確保自訂物件在
json.dumps之前轉換,或使用預設的編碼器。
- 修正: 確保自訂物件在
- 已廢棄的 API - Python 3.9 中已廢棄的一些 Python
stdlib函數 (例如asyncio.get_event_loop,distutils, 以及某些 locale API) 已被移除。- 修正: 更新程式碼,以使用受支援的替代方案。
- 效能變更 - 迴圈和同步任務可能會有不同的行為。
- 修復: 在關鍵路徑上執行負載測試;必要時更新並發邏輯。
提示: 請務必先測試生產指令碼的副本。在受控測試環境中應用的修補程式可降低生產問題的風險。
Python 3.13 的新增功能
以下是 Python 3.13 的一些變更重點:
- 改良的互動式解釋器 - 多行編輯、顏色和彩色化追蹤記錄。
- 實驗性的自由線程建立模式 - 允許在某些平台上使用真正的平行線程 (沒有 GIL)。
- 實驗性 JIT - 改善效能的早期基礎工作。
- 更好的除錯工具 -
locals()變異,現在採用定義明確的語義運作。 - 新的記憶體分配器 - 包含修改過的 mimalloc,若受支援,預設會啟用。
- 更小的檔案 - Docstrings 刪除前端空白,減少記憶體使用量和 .pyc 檔案大小。
- 新的 dbm 後端 - 預設使用
dbm.sqlite3。 - 平台更新 - macOS 最低 10.13、iOS/Android 第 3 級、WASI 第 2 級。
- 類型改進 - 類型預設值、縮小範圍、唯讀項目和廢止註釋。
- 刪除 - 刪除已廢棄的模組 (例如
cgi,telnetlib、imghdr、lib2to3等)。
如需完整的發行說明,請參閱 Python.org 的 「Python 3.13 的新功能 」。
如果您想檢視 3.9 和 3.13 之間引入的具體變更,請參閱:
常見問答
問:我需要馬上遷移所有的腳本嗎?
否。現在開始在 Python 3.13 上測試指令碼,並暫時在 3.9 上進行生產。所有指令碼必須在2026 年 10 月之前遷移到 Python 3.13 。
問:當 Python 3.9 達到生命週期結束時,我現有的腳本會自動中斷嗎?
不會。Workiva 指令碼將依賴 Amazon Linux 2023 (AL2023) 下的 Python 3.9 版本,該版本將持續接收安全修補程式,直至 2026 年 10 月。您的指令碼不會受到 Python 3.9 正式版壽命結束的影響。
問:我可以在 3.13 上測試腳本,而將生產保留在 3.9 上嗎?
是。為您的指令碼建立一個複製本,並更新它以執行在 Python 3.13 上進行測試。在升階至生產階段之前,請先修正複製本中的任何問題。為了避免失去相容性,請保留不同的版本,一個適用於 3.9,一個適用於 3.13,這樣您就可以在需要時輕鬆切換。
問:腳本編輯者會支援變更執行時間嗎?
是。編輯者對 Python 3.13 的支援將與 2025 年 9 月的 API 支援同時提供
問:我可以在哪裡了解更多關於圖書館支援的資訊?
請檢查pyreadiness.org/3.13 和 「支援的腳本函式庫和相依性 」 Workiva 幫助文章。
問:如果切換腳本,我的歷史運行資料會發生什麼變化?
如果覆寫原始腳本,則會保留執行記錄。如果您將觸發器指向副本,原始碼的執行歷程會保留在舊腳本中。
問答集:如果我在 2026 年 10 月前沒有進行轉移,會發生什麼事?
在 2026 年 10 月之後,當 Workiva 停止支援在 AL2023 下的 Python 3.9 執行指令碼時,您的指令碼將自動過渡至 Python 3.13。為了避免干擾,您應該在 2026 年 10 月前測試並移植指令碼到 Python 3.13。
問:在遷移時,我需要變更我的 Chains(自動化工作流程)或整合自動化嗎?
不,只要底層指令碼更新至 Python 3.13,您的 Chains(自動化鏈結)和整合自動化(Integrated Automations)將繼續如預期執行。主要的級距是確保指令碼本身已被移植。
問:如果發生問題,我可以將指令碼從 Python 3.13 回滾到 3.9 嗎?
使用者可以將指令碼的執行時間暫時切換回 Python 3.9,但任何為了適應 Python 3.13 而做的程式碼變更不會自動還原。您需要手動調整指令碼,使它再次與 3.9 相容。更好的方法是維護不同的複製本--一個適用於 Python 3.9,另一個適用於 Python 3.13--這樣您就可以在問題出現時安全地切換不同的版本。