From c425a08a8fa9bff84ac6cc5e52332c1aa98dc95d Mon Sep 17 00:00:00 2001 From: dekun Date: Wed, 29 Jul 2026 21:37:04 +0800 Subject: [PATCH] Rebuild broken .venv when activate is missing after ensurepip failure. Half-created venvs often keep bin/python3 without activate; directory existence is not enough. Co-authored-by: Cursor --- deploy/pull_and_restart.sh | 22 ++++++++++++++++------ docs/更新说明.md | 8 ++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/deploy/pull_and_restart.sh b/deploy/pull_and_restart.sh index a6059e0..1837206 100755 --- a/deploy/pull_and_restart.sh +++ b/deploy/pull_and_restart.sh @@ -44,13 +44,18 @@ if ! command -v python3 >/dev/null 2>&1; then exit 1 fi -# 半截失败的 .venv(缺 ensurepip 时常见)会留下坏目录,必须重建 -if [[ -d "$ROOT/.venv" ]] && [[ ! -x "$ROOT/.venv/bin/python3" ]]; then - echo "[比特骆驼] .venv 不完整,删除后重建" - rm -rf "$ROOT/.venv" -fi +# 缺 ensurepip 时会留下半截 .venv:常有 bin/python3 却没有 activate,不能只看目录是否存在 +project_venv_ok() { + [[ -f "$ROOT/.venv/bin/activate" ]] \ + && [[ -x "$ROOT/.venv/bin/python3" ]] \ + && "$ROOT/.venv/bin/python3" -c "import sys" >/dev/null 2>&1 +} -if [[ ! -d "$ROOT/.venv" ]]; then +if ! project_venv_ok; then + if [[ -e "$ROOT/.venv" ]]; then + echo "[比特骆驼] .venv 不可用(半截/损坏),删除后重建" + rm -rf "$ROOT/.venv" + fi echo "[比特骆驼] create venv" if ! python3 -m venv "$ROOT/.venv"; then pyver="$(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])' 2>/dev/null || echo "3")" @@ -59,6 +64,11 @@ if [[ ! -d "$ROOT/.venv" ]]; then rm -rf "$ROOT/.venv" exit 1 fi + if ! project_venv_ok; then + echo "ERROR: venv 创建后仍不可用(缺 activate 或 python)。" >&2 + rm -rf "$ROOT/.venv" + exit 1 + fi fi # shellcheck disable=SC1091 source "$ROOT/.venv/bin/activate" diff --git a/docs/更新说明.md b/docs/更新说明.md index e9ed186..8cae557 100644 --- a/docs/更新说明.md +++ b/docs/更新说明.md @@ -5,6 +5,14 @@ --- +## 2026-07-29 — 部署:半截 .venv 必须重建(缺 activate) + +### 变更 + +1. 判定 venv 可用改为同时检查 `bin/activate` + `bin/python3`(仅有目录或仅有 python 仍会删掉重建)。 + +--- + ## 2026-07-29 — 部署:自动安装 python3-venv(ensurepip) ### 变更