はじめに
七尾百合子さん、お誕生日 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
この activate スクリプトの元のファイルですが、以下の2つに違いはないように見えます(ファイル全体を VS Code で Compare もしました)
- https://github.com/python/cpython/blob/3.12/Lib/venv/scripts/common/activate#L70
- https://github.com/python/cpython/blob/3.13/Lib/venv/scripts/common/activate#L70
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 とで違いがある?)