$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Pythonのvenvのプロンプト表示をカスタマイズする

pyenv + venvでPython3環境を構築する - $shibayu36->blog;の記事で、Python3でvenvを使った環境を構築することができた。しかしvenvでsource bin/activateすると、自分の設定したプロンプトの左側に(venvの環境名)という文字列が勝手に挟み込まれてしまって、あまり好みではなかった。
f:id:shiba_yu36:20170401143732p:plain

それを以下のように、venv環境の中にいたらpy:(pythonのversion):(venvの環境名)という表示にしたかった。
f:id:shiba_yu36:20170401143900p:plain

のでやってみた。

プロンプトの左側の環境名表示を消す

まずプロンプトの左側の(venvの環境名)を消す。こちら を参考にして、VIRTUAL_ENV_DISABLE_PROMPTという環境変数を設定しておけば良いらしい。

# virtualenvでpromptを変更しない
export VIRTUAL_ENV_DISABLE_PROMPT=1

環境名をプロンプトの好きな場所に表示する

bin/activateのコードを読んでみると、VIRTUAL_ENVという環境変数にそのディレクトリのパスを入れているということが分かる。また、元々プロンプトの左側に出ていた内容も、VIRTUAL_ENVのbasenameを表示していただけだった。

これらを参考にし、またpyenv version-nameを利用すれば、py:(pythonのversion):(venvの環境名)という文字列を作ることが出来る。

PYTHON_VERSION_STRING="py:"$(pyenv version-name)
PYTHON_VIRTUAL_ENV_STRING=""
if [ -n "$VIRTUAL_ENV" ]; then
    PYTHON_VIRTUAL_ENV_STRING=":`basename \"$VIRTUAL_ENV\"`"
fi

あとはこの変数を使ってPROMPTを設定すればOK。僕の場合は他にもperlのversionとかも出していたので、以下のようになった。

### ------------------ ###
# prompt config
precmd () {
    PERL_VERSION_STRING="pl:"$(plenv version-name)
    RUBY_VERSION_STRING="rb:"$(rbenv version-name)
    NODE_VERSION_STRING="nd:"$(ndenv version-name)
    PYTHON_VERSION_STRING="py:"$(pyenv version-name)
    PYTHON_VIRTUAL_ENV_STRING=""
    if [ -n "$VIRTUAL_ENV" ]; then
        PYTHON_VIRTUAL_ENV_STRING=":`basename \"$VIRTUAL_ENV\"`"
    fi
}

function setprompt () {
      PROMPT='%F{yellow}%<...<%~%<< %F{blue}${PERL_VERSION_STRING} ${RUBY_VERSION_STRING} ${NODE_VERSION_STRING} ${PYTHON_VERSION_STRING}${PYTHON_VIRTUAL_ENV_STRING}
%F{blue}%D{%H:%M:%S} %F{green}${USER}%F{white}@%F{green}%m%F{white}%(!.#.$) '
}

setprompt
unfunction setprompt

https://github.com/shibayu36/config-file/blob/master/.zsh/appearance.zsh#L145

まとめ

venvが自動でプロンプトに表示する内容があまりかっこよくなかったので、自分でプロンプト表示をカスタマイズしてみた。以上二つをやれば、最初にやりたかったことができた。

pyenv + venvでPython3環境を構築する

機械学習のモチベーションを上げるためにTensorFlowを触ろうとしている。まずは環境設定でしょうということで、ひとまずPython3環境を作る。今はpyenv + venvで作るのが良いみたいなので、それでやってみたメモ。

pyenvでpythonをインストールする

pyenvが必要かどうかフローチャート - Qiita も参考にしたのだけど、まあ細かくPythonのversionを指定したくなる時もありそうだし、とりあえずpyenvを入れておく。

自分は anyenv を使っているので、それでpyenvをインストール

$ anyenv install pyenv

次にpyenvでpython 3.6.1をインストール

$ pyenv install 3.6.1
$ pyenv versions
  system
* 3.6.1 (set by /Users/shibayu36/.anyenv/envs/pyenv/version)

これでOK。

venvで環境を作る

pythonで、bundlerやnpmみたいにあるディレクトリ配下の環境を作りたい場合、virtualenv というのを使うと良いみたい。また今はpython標準でvenvという名前でvirtualenvが取り込まれたので、それを利用してみる。

環境の用意

まずTensorFlowを試すことを見越して、tensorflow-playgroundというディレクトリで環境を作ってみる。

$ mkdir tensorflow-playground
$ cd tensorflow-playground
$ python3.6 -m venv .

これでこのディレクトリ配下にbinincludeなどのディレクトリが出来たので、用意完了。

環境に入る

それでこの環境で作業したいときは、以下のコマンドを実行する。

$ source bin/activate

するとプロンプトに以下のように環境名が表示される。これでこの環境内で作業が出来るようになる。

(tensorflow-playground) $

環境から出る

deactivateすれば出れる。

$ deactivate

プロンプトから(tensorflow-playground)の表示が消えたらOK。

実際にvenvの環境下でtensorflowをインストールしてみる

あとはうまくいっているか確認。tensorflowをインストールしてみる。https://www.tensorflow.org/install/install_mac

$ source bin/activate
$ pip install --upgrade tensorflow
$ ls lib/python3.6/site-packages/

するとこのディレクトリのlib/python3.6/site-packages/にそれっぽいファイルがインストールされたのでうまくいってそう!ディレクトリ配下にインストールされる形式なので、npmの環境構築と似てますね。

まとめ

今回はTensorFlowを触る前準備として、まずは最近のpython環境について調べて、環境を用意してみた。

毎回何かを触るときにはその前段階でいろいろやっちゃうことが多い。たぶんこれからEmacsの設定が待っている。まあ楽しいからいいんだけど。

mysqlenvの管理配下にデバッグオプション付きのMySQLをインストールする

最近アルゴリズムの勉強をしていて、MySQLの挙動を追う機会があった。そこでMySQLデバッグを出来るようにと、MySQL :: MySQL 5.6 リファレンスマニュアル :: 24.4.1.1 デバッグのための MySQL のコンパイル に書いてあるように、MySQLデバッグオプション付きでコンパイルしてインストールしたかった。

また、自分はmysqlenvを普段使っているので、mysqlenvでデバッグオプションがついたMySQLにすぐに切り替えられるようにもしておきたい。

ただ一つ問題があった。それはmysqlenv installコマンドにはデバッグ付きでインストールできる方法がないことだった。

そこでmysqlenvの管理配下にデバッグオプション付きのMySQLをインストールする方法が何かないか試したのでメモ。

mysqlenvが裏側で何を使っているか

以下のコマンドを実行してみたら結局は裏側はmysql-buildであるということが分かる。

$ mysqlenv install --as 5.6.35-debug 5.6.35
run: mysql-build 5.6.35 /Users/shibayu36/.mysqlenv/mysqls/5.6.35-debug

mysql-buildのオプションを調べる

$ mysql-build --help
mysql-build, Compile and Install MySQL
usage: mysql-build [-v|--verbose] [--with-debug] [--sudo] definition prefix [plugin[,...]]
       mysql-build --definitions
       mysql-build --plugins

  -v/--verbose     Verbose mode: print compilation status to stdout
  --with-debug     Debug build
  --definitions    List all built-in definitions
  --plugins        List all built-in plugins
  --sudo           Run install as superuser

正に必要な--with-debugオプションがあった。しかしmysqlenvからこのオプションを渡す方法はコードを見る限りなさそうだった。

mysql-buildで直接mysqlenvの管理配下にインストールする

mysql-build 5.6.35 /Users/shibayu36/.mysqlenv/mysqls/5.6.35-debugをよく見ると、結局はmysqlenvは~/.mysqlenv/mysqls/以下にmysql-buildでインストールしているだけである。そこで以下のコマンドを実行すればmysqlenvの管理配下にインストールできる。

$ mysql-build --with-debug 5.6.35 /Users/shibayu36/.mysqlenv/mysqls/5.6.35-debug

mysql-install-dbを実行する

mysqlenvのコードを見てみると、mysqlenv installは自動でmysql_install_dbを発行してくれている。そこで最後にそれを実行する。

$ cd /Users/shibayu36/.mysqlenv/mysqls/5.6.35-debug
$ find . | grep mysql_install_db
./man/man1/mysql_install_db.1
./scripts/mysql_install_db
$ ./scripts/mysql_install_db
...

mysqlenvで確認する

$ mysqlenv list
  5.5.49
* 5.6.27
  5.6.35-debug
$ mysqlenv local 5.6.35-debug
$ mysqlenv list
  5.5.49
  5.6.27
* 5.6.35-debug
$ mysql --help
# --debugオプションがあれば成功

ということで成功してそう。実際にdebugオプションで起動はまだしていないので、もうちょっと確認する必要はあるが...

まとめ

今回はmysqlenvの管理配下にデバッグオプション付きのMySQLをインストールする方法についてメモしておいた。