2019/04/02

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

@Python 3.6.7

Python2 系も使うことが無くなってきたので、遅ればせながら [virtualenv](https://virtualenv.pypa.io/en/latest/) から [venv](https://docs.python.org/ja/3/library/venv.html) に移行してみました。

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

> 参考
>
> [venv: Python 仮想環境管理 - Qiita](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)



その方針自体は良いvirtualenvwrapper を使っている時も、環境とプロジェクトが分かれていると管理しづらいとは思っていたのですが、そうするとシェルのプロンプトが `(venv)` になってしまいます。
### プロンプトは --prompt オプションで変更できる これだと、「どの仮想環境を使用しているのか分かりづらくらなくなって嫌だな」と思っていたところ、venv のヘルプに `--prompt PROMPT` というオプションが。 これを使うと、プロンプトを任意のものに変更できます。素晴らしい。
### 既に作成済のものを変える方法1 `venv/bin/activate` 内を見てみると、環境変数`PS1` を書き換えているだけなのがわかります。 ここを変更すれば、任意のプロンプトにすることが可能です。 ```shell `first-line: 57; 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](https://github.com/python/cpython/pull/11440) 将来的に、プロンプトは `venv/bin/activate/` の中に書かれるのではなく `venv/pyvenv.cfg` 内に変数として格納されます。 Python のバージョンによって挙動が変わってくるので注意しましょう。 ### 既に作成済のものを変える方法2 以下のように仮想環境を再作成するのもアリかと思います正確には既に作成済みのものを変更するわけでは無いですが。 ```console `gutter: false; (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 ```

0 件のコメント: