2019/04/02

[Python] venv のプロンプトを任意のものに変更する

@Python 3.6.7

Python2 系も使うことが無くなってきたので、遅ればせながら virtualenv から venv に移行してみました。

調べてみると、venv では virtualenvwrapper のような一元管理を使うのではなく、プロジェクト直下に venv というディレクトリを作って管理したほうが良いと書いてあるサイトがちらほら。

参考

venv: Python 仮想環境管理 - Qiita

その方針自体は良い1のですが、そうするとシェルのプロンプトが (venv) になってしまいます。

プロンプトは --prompt オプションで変更できる

これだと、「どの仮想環境を使用しているのか分かりづらくらなくなって嫌だな」と思っていたところ、venv のヘルプに --prompt PROMPT というオプションが。

これを使うと、プロンプトを任意のものに変更できます。素晴らしい。

既に作成済のものを変える方法1

venv/bin/activate 内を見てみると、環境変数PS1 を書き換えているだけなのがわかります。 ここを変更すれば、任意のプロンプトにすることが可能です。

57
58
if [ "x(myproject) " != x ] ; then
    PS1="(myproject) ${PS1:-}"

ただ、以下の「既に作成済のものを変える方法1(未来)」に書いたように、将来的には pyvenv.cfg 内に設定が移行することが決定しています。

既に作成済のものを変える方法1(未来)

「プロンプトを activate に直接書くのではなく pyvenv.cfg に記述したほうがよい」という Issue が挙げられ、変更は既に本線にマージ済みのようです。

参考

bpo-35661: Store the venv prompt in pyvenv.cfg by csabella · Pull Request #11440 · python/cpython · GitHub

将来的に、プロンプトは venv/bin/activate/ の中に書かれるのではなく venv/pyvenv.cfg 内に変数として格納されます。 Python のバージョンによって挙動が変わってくるので注意しましょう。

既に作成済のものを変える方法2

以下のように仮想環境を再作成するのもアリかと思います2

(venv) $ pip freeze > requirements.txt
(venv) $ deactivate
$ mv venv venv.bak
$ python3 -m venv --prompt myproject venv
$ . venv/bin/activate
(myproject) $ pip install -r requirements.txt
  1. virtualenvwrapper を使っている時も、環境とプロジェクトが分かれていると管理しづらいとは思っていた 
  2. 正確には既に作成済みのものを変更するわけでは無いですが 
?

0 件のコメント: