Workiva スクリプトと Python 3.9 サポート終了のお知らせ
自動化機能を将来にわたって活用し続けられるよう、、WorkivaはPython 3.13のサポート を導入するとともに、スクリプトごとに実行環境のバージョンを選択できるスクリプトレベルの設定機能も追加しました。このガイドでは、3.9 から 3.13 へ安全に移動完了する方法、テストする内容、最小限の混乱で変更を展開する方法を説明します。
2025年10月まで 、Workiva Scriptingは、Python Software Foundation が公式にリリースしたPython 3.9に依存していました。このバージョンは2025年10月にサポート終了を迎え、その結果、セキュリティ更新やバグ修正は提供されなくなりました。
これを受けて、Workiva Scriptingでは、のAmazon Linux 2023 (AL2023) イメージへの移行を行いました。このイメージには、Python 3.9およびPython 3.13の両方に対応した独自のビルドとサポートが含まれています。この変更により、Python 3.9 は、アップストリームの Python リリースに対してオープンソースコミュニティによるパッチ提供が終了している場合でも、Amazon のアップデートサイクルを通じて、継続的なセキュリティパッチ およびメンテナンスを受けられるようになります。
この移行に伴い、Workiva Scripting では、(2027年10月)まで、Python 3.9 でのスクリプトの実行を安全にサポートし続けます 。
この移行について考えるべき人現在、Python 3.9で Workiva Scripting の自動化を実行している人 - 手動、チェーンから、または統合された自動化を介してトリガーされたかに関わらず。
何もしなければどうなりますか?AL2023のパッチにより、2027年10月まではスクリプトのセキュリティが維持されますが、Python 3.13はより新しいサポート対象のランタイムであるため、こちらへの移行をお勧めします。
End-of-life timelines and supported versions の背景については、公式Python release status webpage をレビューしてください。
Workiva はどのようにこの変更をサポートしていますか?
Workivaは、開発者がスクリプトで使用するPythonランタイムを制御できるようにするアップデートを公開しました。今回のアップデートでは、以下の変更が行われました:
- Python 3.13 のサポート: すべての新しいスクリプトは、最新の安定版である Python 3.13 をデフォルトとして使用するように変更されました。
- スクリプトごとの実行時移行: 既存の Python 3.9 スクリプトは Python 3.13 へ移行可能です。スクリプトをPython 3.13に移行すると、Python 3.9に戻すことはできません。
- 下位互換性: 既存のスクリプトはすべて、更新するまでは引き続きPython 3.9を使用します。
- エディタおよびAPIのサポート: Workivaスクリプトエディタで直接、またはスクリプティングAPIを介して、ランタイムを設定または更新することができます。
これにより、独自のスケジュールで移行し、安全にテストし、準備が整ったと確信したときにのみ本番スクリプトを切り替えることができます。
移行スケジュール
ヘルプはこちらです:
- WorkivaでPython 3.13が利用可能になりました(2025年9月): 既存のPython 3.9スクリプトは、スクリプティングAPIまたはスクリプティングエディタを使用してPython 3.13へ移行できます。新しいスクリプトでは Python 3.13 が使用されています。
- Python 3.9 のサポート終了(2025年10月): Python コミュニティによる公式サポートが終了します。Workivaは2027年10月までAL2023によるサポートを継続しますが、移行を強く推奨します。
- 2027年10月: Workivaは、2027年10月にPython 3.9のサポートを終了する予定です。それ以降は、すべてのスクリプトがPython 3.13上で実行されることになります。
移行を進める
Python 3.13 でのスクリプトのテストは、3.13 で正しく動作することが確認できるまでは本番環境を 3.9 のままにしておきつつ、できるだけ早く開始すべきです。Python 3.13 の使用に慣れたら、本番スクリプトを遅延なく Python 3.13 ランタイムに切り替えてください。
Python 3.13 へのスクリプトの切り替え
私たちの推奨するロールアウトパターン: コピーを作成し、バージョンを更新し、テストし、そして上げます。本番環境へのリスクを最小限に抑え、必要に応じて実行履歴を残すことができます。
ステップ1 - コピーの作成
- Workiva で、本番スクリプトのコピーを作成します。
コピーは Python 3.13 に設定されます。
ステップ2 - コピーのテストと適応
- コピーを安全/テストコンテキストで実行します。
- 変更点を修正します ("Common issues & fixes" を参照ください)。
- 出力、副作用、パフォーマンスを検証してください。
ステップ3 - 3.13への変更(2つのオプション)
オプション A - 実行履歴を保持します。
- コピー から更新されたコードをコピー&ペーストでオリジナル スクリプトに貼り付けます。
- オリジナルの スクリプトのランタイムをPython 3.13 に変更します。
- テスト中を再実行し、オリジナルの通常のスケジューリング/トリガーを再開します。
- (オプション)コピーをアーカイブ(または清算)します。
オプション B - これにより、プロダクション実行履歴は保持されません。
- プロダクション トリガー (つまり、チェーン トリガー) を、オリジナル スクリプトからコピー スクリプトを指すように変更します。
- コピー が新規プロダクション スクリプトになります (Python 3.13 で実行)。
- (オプション)オリジナルをアーカイブ(する)か清算 回収してください。
行動喚起: どの選択肢を選んだとしても、2027年10月までに、すべての稼働中のスクリプトをPython 3.13 へ移行してください。
Python ランタイムバージョンの更新
スクリプトAPIの使用
作業を開始する前に、API グラントに「script:read」および「script:write」のスコープが含まれていることを確認してください。API グラントの作成または更新方法については、「Workiva API の設定」 を参照してください。
-
スクリプトのランタイムを決定します。
GET /scripts/{scriptId} Authorization: Bearer {token} X-Version: 2026-01-01レスポンスの
runtimeの値をチェックします。 -
スクリプトを Python 3.13 に更新します。
PATCH /scripts/{scriptId} Authorization: Bearer {token} X-Version: 2026-01-01 Content-Type: application/json [{ "op": "replace", "path": "/runtime", "value": "python3.13" }]
実行時間を変更しても、スクリプトの依存関係バンドルは自動的に再生成されません。スクリプトにrequirements.txt のソースが含まれている場合は、ランタイムを更新した後、依存関係の生成を開始し、処理が完了するのを待ってからスクリプトを実行してください。、requirements.txt、 がないスクリプトについては、依存関係の生成は必要ありません。
詳細については、Workivaのデベロッパー向けページをご覧ください:
例Python ランタイムバージョンの変更と読み込み
以下のサンプルコードは、スクリプトの現在の実行環境を取得し、Python 3.13 へ移行し、Scripting API を使用してその依存関係バンドルを再生成します。
import os import time import requests CLIENT_ID = os.environ["CLIENT_ID"] CLIENT_SECRET = os.environ["CLIENT_SECRET"] SCRIPT_ID = os.environ["SCRIPT_ID"] API_VERSION = "2026-01-01" API_BASE_URL = "https://api.app.wdesk.com" SCRIPTS_API_URL = f"{API_BASE_URL}/scripts" AUTH_URL = f"{API_BASE_URL}/oauth2/token" def get_auth_headers(client_id, client_secret): response = requests.post( AUTH_URL, headers={ "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", "X-Version": API_VERSION, }, data={ "client_id": client_id, "client_secret": client_secret, "grant_type": "client_credentials", }, timeout=30, ) response.raise_for_status() return { "Authorization": f"Bearer {response.json()['access_token']}", "X-Version": API_VERSION, } def read_version(script_id, headers): response = requests.get( f"{SCRIPTS_API_URL}/{script_id}", headers=headers, timeout=30, ) response.raise_for_status() script = response.json() print( f"'{script['name']}' スクリプトの Python バージョン: " f"{script['runtime'].replace('python', '')}" ) def change_to_python_313(script_id, headers): response = requests.patch( f"{SCRIPTS_API_URL}/{script_id}", headers={ **headers, "Content-Type": "application/json", }, json=[{ "op": "replace", "path": "/runtime", "value": "python3.13", }], timeout=30, ) response.raise_for_status() script = response.json() print( f"'{script['name']}' スクリプトの Python バージョンが次のように変更されました: " f"{script['runtime'].replace('python', '')}" ) def has_requirements(script_id, headers): response = requests.get( f"{SCRIPTS_API_URL}/{script_id}/sources", headers=headers, timeout=30, ) response.raise_for_status() return any( source["path"] == "requirements.txt" for source in response.json()["data"] ) def regenerate_dependencies(script_id, headers): response = requests.post( f"{SCRIPTS_API_URL}/{script_id}/dependencies/generation", headers=headers, timeout=30, ) response.raise_for_status() operation_url = response.json()["operationLocation"] while True: operation_response = requests.get( operation_url, headers=headers, timeout=30, ) operation_response.raise_for_status() operation = operation_response.json() if operation["status"] in {"completed", "failed", "cancelled"}: break time.sleep( int(operation_response.headers.get("Retry-After", "5")) ) if operation["status"] != "completed": raise RuntimeError( f"依存関係の生成はステータス " f"{operation['status']} で終了しました: {operation}" ) headers = get_auth_headers(CLIENT_ID, CLIENT_SECRET) read_version(SCRIPT_ID, headers) change_to_python_313(SCRIPT_ID, headers) if has_requirements(SCRIPT_ID, headers): regenerate_dependencies(SCRIPT_ID, headers) print("依存関係の再生成に成功しました。") else: print("requirements.txt ファイルが見つかりませんでした。依存関係の生成をスキップしました。")スクリプト編集者の使い方
スクリプトエディタを使用すると、UI上で直接ランタイムを設定することができます。Python 3.9 を使用している既存のスクリプトについては、のプロパティ → 実行環境バージョン( )を設定して、Python 3.13 へ移行してください。保存後は、スクリプトをPython 3.9に戻すことはできません。
編集者でスクリプトを更新するには
- スクリプト エディタ でスクリプトを開きます。
- 右側のProperties パネルに移動します。
- Runtime Version の下で、ドロップダウンからPython 3.13 を選択します。
- 変更を保存します。
- 本番環境に上げる前に、安全/テスト環境でスクリプトを実行してください。
ヒント
- スクリプト内のサードパーティ製パッケージが Python 3.13 と互換性があることを確認してください。
-
requirements.txtファイルに固定されているパッケージのバージョンを更新してください (例えば、Python 3.9 とは異なり、requests==2.28は 3.13 では必要ありません)。 - Python バージョン3.10,3.11,3.12, and3.13, を含む、Python の主な変更に関する詳細については、Python の公式ドキュメントをお読みください:
- 構造的なパターン・マッチング、f-文字列の更新、エラー・メッセージの改善
- 大幅なパフォーマンスの向上(関数呼び出し、文字列操作、メモリ管理、JSONシリアライズ/デシリアライズ)
- パッケージの非推奨と特定のパッケージパラメータの削除 (
cgi,cgitb,distutilsなどが非推奨になりました;asyncio"loop" パラメータが削除されました)
3.9 から 3.13 への移動でよくある問題と修正
Python 3.9 から 3.13 にスクリプトを移動するときに直面するかもしれない一般的な問題と、それに対する修正案を示します:
- サードパーティ製ライブラリ: 一部のパッケージは、まだ Python 3.13 に対応していない場合があります。
- 修正: 互換性のある最新バージョンにアップグレードするか、 代替に置き換えてください。固定されている要件は慎重にテストしてください。ライブラリのサポートはpyreadiness.org/3.13 で確認でき、詳細については "Supported scripting libraries and dependencies" ヘルプ記事をレビューしてください。
- Requests ライブラリのバージョン: の
requestsライブラリは、Workiva Scripting で最も一般的に使用されているサードパーティ製ライブラリです。Python 3.9 の初期リリースでは、requestsバージョン 2.30.0 以降でスクリプトが分割されます。Python 3.13 に移行すると、最新版のリクエストを問題なく使えるようになります。 - Python 3.13 では、文字列とバイトの扱いに違いがあります: 型チェックが厳格化されたことで、これまで見過ごされていた問題が表面化する可能性があります。
- 修正:
strとbytesを混在させるコードをチェックし、明示的なエンコード/デコードを確実にします。
- 修正:
- 日付・時刻およびタイムゾーンの挙動: Python 3.13 では、の
zoneinfoライブラリに違いがあり、解析がより厳格になっています。- 修正: すべての日付/時間ロジック、特に書式設定とタイムゾーン変換をテストしてください。
- JSONのシリアライズ: ルールがより厳格なため、一部のオブジェクトはシリアライズに失敗する場合があります。
- 修正: カスタムオブジェクトが
json.dumpsの前に変換されるようにするか、デフォルトのエンコーダを使うようにしました。
- 修正: カスタムオブジェクトが
- 非推奨のAPI: Pythonの標準
ライブラリ および関数(例:、asyncio.get_event_loop 、、、Python 3.9で非推奨となっていたものが削除されました。distutils、および特定のロケールAPIなど)のうち- 修正: サポートされている代替を使用するようにコードを更新しました。
- パフォーマンスの変更点: ループや非同期タスクの挙動が異なる場合があります。
- 修正 クリティカルパスの負荷テストを実行し、必要に応じて同時実行ロジックを更新します。
ヒント 本番用スクリプトのコピーを必ず最初にテストします。コントロールされたテスト環境で適用された修正は、本番環境での問題のリスクを減らします。
Python 3.13 の新規機能
Python 3.13 の変更点のハイライトです:
- インタラクティブ・インタプリタの機能強化: 複数行編集、色分け、および色分けされたトレースバック。
- 実験的なフリースレッドビルドモード: 一部のプラットフォームで、真の並列スレッド(GILなし)を使用できるようにします。
- 実験的なJIT: パフォーマンス向上のための初期段階の基盤整備。
- デバッグツールの改善:
locals()による変更操作が、明確に定義された意味論に基づいて動作するようになりました。 - 新しいメモリアロケータ: 修正済みのmimallocが含まれており、サポートされている場合はデフォルトで有効になっています。
- ファイルサイズの縮小: Docstringの先頭にある空白を削除することで、メモリ使用量と.pycファイルのサイズを削減します。
- 新しいdbmバックエンド: デフォルトでは、
dbm.sqlite3を使用します。 - プラットフォームの更新情報: 、macOS 10.13以上、iOS/Android Tier 3、WASI Tier 2。
- 型に関する改善点: 型のデフォルト値、型の絞り込み、読み取り専用項目、および非推奨の注釈。
- 削除されたモジュール: 非推奨モジュールが削除されました(例:
cgi、telnetlib、imghdr、lib2to3 など)。
完全なリリースノートは Python.org の "What's New in Python 3.13" を参照してください。
3.9 から 3.13 の間に導入された具体的な変更点をレビューしたい場合は、以下を参照してください:
よくある質問
質疑応答/Q&A: 今すぐすべてのスクリプトを移行する必要がありますか?
いいえ。今すぐPython 3.13でスクリプトのテストを開始し、その間も本番環境は3.9のまま維持することができます。2027年10月日までに、すべてのスクリプトをPython 3.13に移行する必要があります。 。
Q: Python 3.9のサポート終了に伴い、既存のスクリプトは自動的に動作しなくなったのでしょうか?
いいえ。Workiva Scripting は、Amazon Linux 2023 (AL2023) 上の Amazon Python 3.9 バージョンを基盤としており、このバージョンには 2027 年 10 月までセキュリティパッチが提供され続けます。Python 3.9の公式サポート終了により、お客様のスクリプトに影響が生じることはありません。
質疑応答/Q&A:本番環境は 3.9 のまま、スクリプトを 3.13 でテストできますか?
はい。テスト用にスクリプトのコピーを作成してください。このコピーは自動的にPython 3.13で実行されるように設定されます。本番環境に上げる前に、コピーに問題があれば修正してください。互換性の喪失を避けるため、3.9用と3.13用の別々のバージョンを用意してください。
Q: スクリプトエディタでは、実行時の変更に対応していますか?
はい。スクリプトのPythonランタイムは、スクリプトエディタで直接設定できます。スクリプトを開き、「プロパティ」パネルに移動して、「ランタイムバージョン」の下にあるバージョンを選択してください。
質疑応答/Q&A ライブラリサポートに関する詳細はこちら。
pyreadiness.org/3.13 と " Supported scripting libraries and dependencies " Workiva ヘルプ記事を確認してください。
質疑応答/Q&A スクリプトを切り替えると、過去の実行データはどうなりますか?
場合によります。元のスクリプトを上書きした場合、実行履歴は保持されます。コピーにトリガーをポイントした場合、オリジナルの実行履歴は古いスクリプトのまま残ります。
Q: 2027年10月までに移行しなかった場合はどうなりますか?
2027年10月以降、WorkivaがAL2023環境下でのPython 3.9によるスクリプト実行のサポートを終了するため、お客様のスクリプトは自動的にPython 3.13に移行されます。サービスへの影響を避けるため、2027年10月よりかなり前に、スクリプトのテストとPython 3.13への移行を完了しておく必要があります。
Q: 移行時にチェーンや統合自動化を変更する必要がありますか?
いいえ。基盤となるスクリプトがPython 3.13に更新されていれば、チェーンおよび統合オートメーションは引き続き正常に動作します。主なステップは、スクリプト自体を確実に移行することです。
質疑応答/Q&A 問題発生時にスクリプトを Python 3.13 から 3.9 にロールバックできますか?
いいえ。スクリプトが Python 3.13 に設定されると、その実行環境を Python 3.9 に戻すことはできません。万が一に備えて、Python 3.9 用のスクリプトを別途用意しておきましょう。つまり、3.9 用と 3.13 用で別々のバージョンを維持しておくのです。そうすれば、テスト中に問題が発生した場合でも、3.9 用のスクリプトに戻すことができます。