今更pythonを使い始める
わけあってpythonを使う必要性に駆られたので、最近の環境分離系のデファクトについて調べたのでメモしておく。
前提とする環境
- macos
- python3.6以降
python仮想環境の概要
環境分離
pyvenvがpython3.3以降標準で使える。virtualenvを標準に取り込んだもの。
これを使うのが間違えなさそう。
ライブラリの場所を切り替えることができる。
処理系切り替え(使わない方向で)
pyenvというのがある。
python処理系のバージョンを複数管理することができる。
基本的に最新のpythonで動作させる方が良さそうなので、pyvenvで事足りるのであればあまり使わない方がいいかも。
pipenvとかどうよ(使うか悩ましい。)
pyvenv, pipでできることを、よりクールでヒップに
できるようにするツール。
rubyのbundlerみたいな感じ。
- pipenvコマンドを起点にする。
- pyvenv, pipの雑多な操作をラップしてくれる。
-
pip freeze
よりも高度なパッケージロックを提供してくれる。
pyvenv, pipでミニマルにやるのが良さそうだけど、どうなんだろう。
rubyとの比較
python | ruby | |
---|---|---|
パッケージリポジトリ | pip | gem |
パッケージバージョン固定 | pip | bundler |
環境分離 | pyvenv(venv) | bundler |
処理系切り替え | pyenv | rbenv |
rubyがgemとbundlerで解決していることを、pythonはpipとvenvで解決している。
ここでいう解決したいこととは、
- パッケージの名前空間を分離する。
- パッケージのバージョン依存を管理する。
- パッケージのバージョンを固定する。
処理系切り替えは、あまり関わらない方が良さそうだ。
rbenvもいい思い出がない。
venv, pipを使ってみる
分離環境作成
$ python -m venv ~/dev/py1
分離環境に入る
$ . ~/dev/py1/bin/activate # "." === "source" on bash
$ pip install tensorflow
シェルスクリプトのactivate
を読めばわかるけど、
~/dev/py1/bin
をPATH
の先頭に設定することで、python, pipコマンドを仮想環境のものを呼ぶようにしているだけ。
pipenvを使ってみる。
## install pipenv
$ sudo python -m pip install pipenv
$ mkdir ~/dev/pipenv1
$ cd ~/dev/pipenv1
## ref:https://docs.pipenv.org/en/latest/advanced/#configuration-with-environment-variables
## `.venv`を`~/dev/pipenv1`配下に作るよう環境変数を設定する。
$ export PIPENV_VENV_IN_PROJECT=1
## pipenv環境を初期化する。`.venv`, `Pipfile`などを生成する。
$ pipenv --python 3.7
## 試しにhylangをインストールする。Pipenv.lockを生成or更新してくれる。
$ pipenv install hy=0.17.0
## 環境配下でコマンドを実行する。rubyの`bundle exec`に相当する。
$ pipenv run pip list
## 環境に入る。
$ pipenv shell
使ってみた感じまあ良さそう。絵文字とか色制御文字が多用されているのがヒップな感じで鬱陶しいけど。
venv
同様、pythonが公式に取り込むかもしれない。
pythonてユーザが多いせいか、javascriptと同じ感じでえらくヒップになってるな。
結論
pipenv
使ってみるかな。Pipenv
, Pipenv.lock
の仕組み以外はpip
とvenv(virtualenv)
をラップしているだけのように見えるので、
いざとなれば抜けることはできそう。
flask
でもいじってみるかな。
個人的は背景
過去にjythonやcpythonで簡単な処理を書いたり、zopeやploneでwikiを立ち上げて運用していたことはあるけど、
長らくperl, ruby (そしてcommon lisp)を使う日々が続いた。
もちろんC, SQL, javascriptはこれまでも、そしてこれからも長く付き合っていく言語である。
posix, 永続化, webブラウザというプラットフォームを握っている以上逃れることはできない。
業務でpythonを使うこともなくはなかったけど、メインはperl, ruby, cだった。
個人的にperlは、レシシカルクロージャが作れてシンタックスも簡潔だし、
弱点がない言語であると(今だに)思うものの、人気が低下してしまい、仕事の量が少ないのは個人の力ではどうしようもない。
事情があってpythonを使うことになったので、最近のpython事情について調べつつメモしていこうと思う。
pythonのインデントシンタックスは言語的な欠陥だと思うものの、まあいざとなったらhylangでしのぐかと考えている。