nikkie-ftnextの日記

イベントレポートや読書メモを発信

Python 3.12 の venv で作る仮想環境、プロンプトの見た目がちょっとだけ違いますよね

はじめに

七尾百合子さん、お誕生日 173日目 おめでとうございます! nikkieです。

見た目が違う事象について調べました。
※仮想環境の機能にバグがあるわけではありません

目次

Python 3.12 の venv で作った仮想環境は、プロンプトに2重のカッコ

% python3.13 -V
Python 3.13.5
% python3.13 -m venv py313env --upgrade-deps
% source py313env/bin/activate
(py313env) %
% python3.12 -V
Python 3.12.11
% python3.12 -m venv py312env --upgrade-deps
% source py312env/bin/activate
((py312env) ) %

プロンプトの先頭の((py312env) )

  • カッコが2重
  • 終わりにスペースが入っている

検索して文献調査

GPT-5 調べの文献を追っていきます。

discuss に報告されていました。

issue に飛びます。

There will be double parenthesis displayed on the terminal.

((venv3.12.10) )のようなプロンプトが報告されています1

This bug may be related to this commit because Python 3.12.9 is normal.

Python 3.12 の issue 対応の中で、見た目のバグが混入してしまったようとのこと。

activate スクリプトの diff

activate スクリプトの diff を見てみると

% diff py312env/bin/activate py313env/bin/activate
57c57
< VIRTUAL_ENV_PROMPT='(py312env) '
---
> VIRTUAL_ENV_PROMPT=py313env
70c70
<     PS1="("'(py312env) '") ${PS1:-}"
---
>     PS1="("py313env") ${PS1:-}"

70行目の"${PS1:-}"は、PS1が未定義なら空文字列です。
ref: https://future-architect.github.io/articles/20210406/#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E5%B1%95%E9%96%8B-Shell-Parameter-Expansion

  • Python 3.12 の方は ((py312env) )
  • Python 3.13 の方は (py313env)

この activate スクリプトの元のファイルですが、以下の2つに違いはないように見えます(ファイル全体を VS Code で Compare もしました)

PS1="("__VENV_PROMPT__") ${PS1:-}"

なので、__VENV_PROMPT__2に入っている文字列がカッコ付きかどうかが違うようです。
この文字列がどのように代入されるのかまでは追いきれていません。

対応しないとしてクローズ

Python 3.12 だけの問題であり、3.12 はバグ修正を受け付けないためクローズされました。

https://github.com/python/cpython/issues/132361#issuecomment-2806729854

This issue should be closed, it only affects 3.12 which no longer allows bugfixes.

discuss の発言を見て納得感はあります。
https://discuss.python.org/t/python-3-12-10-venv-has-extra-parentheses/88559/3

but it’s easy to fix locally.

終わりに

Python 3.12 の venv で作った仮想環境のプロンプトが若干違う事象を GPT-5 の調査を起点に見てみました。
見た目が違うだけなので、issue 自体は閉じられています。
実際手元での修正は容易です。

3.12 と 3.13 で同じactivateスクリプトに見えるんですよね。
__VENV_PROMPT__にどんな文字列が入るか追加調査の余地があります(3.12 と 3.13 とで違いがある?)