印刷(PNG保存)失敗トラブル対応メモ
以下は、今回発生した「印刷(PNG保存)失敗」の原因と対応を、再発防止用のメモとして整理したものです。
そのまま社内メモ/作業ログに貼れる体裁にしています。
印刷(PNG保存)失敗トラブル対応メモ
対象:kakimaru / tsubame(Flask + Playwright 構成)
1. 現象
- Web画面上で「選択した画面をPNG保存」を実行すると失敗
- 表示例
失敗: /shot HTTP 500 - kakimaru / tsubame の両方で再現(PC交換後)
2. 原因の全体像
本質的な原因
PC交換により Python 実行環境(venv・依存ライブラリ・Playwright/Chromium)が不整合になった
コードそのものは壊れていなかった。
3. 個別の原因と対処
(1) systemd が venv ではない Python で起動していた
原因
- systemd は
activateを通らない ExecStart=python server.pyのような指定だと- system python
- pyenv の python
を拾ってしまう
対処
systemd の ExecStart を venv の python の絶対パスに固定。
例:
ExecStart=/home/tomoi/kakimaru/venv/bin/python /home/tomoi/kakimaru/src/server.py
ExecStart=/home/tomoi/tsubame/src/.venv/bin/python /home/tomoi/tsubame/src/server.py
反映:
sudo systemctl daemon-reload
sudo systemctl restart <service-name>
(2) venv 内の pip / 依存パッケージが壊れていた
症状
pip show playwright等で例外が出るModuleNotFoundErrorが連鎖的に発生
対処
- venv を 作り直す
- その後、依存を入れ直す
python3.12 -m venv venv
venv/bin/python -m pip install -U pip setuptools wheel
(3) Playwright は入っているが Chromium 本体が入っていなかった
症状
/shotが HTTP 500- Flask 側では Playwright 起動時に例外
対処
venv の python で Chromium を明示的に導入。
venv/bin/python -m playwright install chromium
必要に応じて OS 依存も導入:
sudo venv/bin/python -m playwright install-deps chromium
(4) psycopg2 が未導入、またはビルド失敗
症状
ModuleNotFoundError: No module named 'psycopg2'
または
fatal error: Python.h: No such file or directory
対処(開発環境)
venv/bin/python -m pip install psycopg2-binary
(本番用途でソースビルドが必要な場合は python3.12-dev 等を導入)
(5) systemd サービスと手動起動が混在していた
症状
Address already in use
Port XXXX is in use by another program
原因
- systemd サービスが既に起動中
- その状態で手動起動した
対処
- 一度 service を停止
- venv python で手動起動して動作確認
- 問題なければ service を修正して再起動
4. 最終的に正常と判断できる状態
以下がすべて満たされていること:
- systemd の
ExecStartが venv の python を指している ss -ltnpで該当ポートの python 実体が venv 配下- Web画面から「PNG保存」が成功
journalctlに Playwright / Chromium エラーが出ていない
5. 教訓・再発防止策
- systemd + Python アプリでは、必ず venv の python を絶対パス指定
- PC交換・OS再構築時は
- venv
- pip
- Playwright + Chromium
を「必ず再確認」
- 「コードは正しいが環境が壊れている」ケースは多い
→ まず疑うのは 実行 python と依存関係
以上です。
このメモがあれば、次回同様のトラブルは 最短で切り分け・復旧できます。