なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

Pythonのパッケージ管理とsystemdでプロセスをずっと上げておく方法を書いておく

タイトルは半分当たっていて、半分は嘘。

Pythonをちゃんと環境作ってやったことが今までなかったので、今わかってる範囲の情報をまとめていく。

pip

Pythonのパッケージ管理システム。Pythonで作られたプロジェクトのインストールにもよく使われている。

依存パッケージの管理

pipにはfreezeサブコマンドがあり、現在の環境で使っているパッケージとバージョンを出力できる。

このリストをrequirements.txtで出力しておき、pipでこれをインストールするということがよく行われているらしい。

これらは後述するvirtualenvvenvと組み合わせて使うとクリーンな環境を用意できる。

環境のパッケージを出力

pip freeze > requirements.txt

環境にパッケージをインストール

pip install -r requirements.txt

virtualenv

実行環境管理ツール。rvm がツールとしては近い。 シェルと組み合わせて仮想環境を構築する。

仮想環境にpipを使って必要なパッケージをインストールして、動作環境を作ることでpython環境を隔離できる。

と思ったけど、Python3.3からvenvが公式に組み込まれたと聞きつけたので、virtualenvはもっぱらPython2系の環境を隔離したいときに使うことになる。

venv

Python3.3からバンドルされている環境管理ツール。 virtualenvと同様の機能を提供するが個別にインストールする必要はなく、Python3.3以降の環境であればデフォルトで使えると考えて良い。

python3 -m venv (環境名)

venvの実行例

python3 -m venv foo
cd foo
source bin/activate

venvが行うこと

他にもあるかもしれない。あんまりちゃんと読んではいない。

注意点

  • source を使って追加のスクリプトをシェルに食わせているので、環境はディレクトリ以下でなくとも有効。
  • 解除するには deactivate を使うが、同じ名前の関数を用意しているとハマるので注意する
    • まあ大した問題ではない気もする

venv環境の切り方

この辺りから我流になってくるが、動作させたいプロジェクトのディレクトリを作ったらその名前でvenvを用意してもいいと思う。

共通で使えるvenvを用意するとすぐ書き始められる利点はあるが、依存パッケージの管理と言う面ではややとっ散らかりそうな雰囲気があるので慣れてくるまでは控える。

環境を揃える

インストール

Macだとbrewで簡単にインストールできる

brew install python3

PATHを通す

pipでインストールされるスクリプトを簡単に呼び出せるように PATH に追加しておくと便利。

export PATH="$HOME/Library/Python/3.6/bin:$PATH"

PDB

Pythonデバッグツール。とりあえず適当に試したいときに使えば便利っぽい。

インタラクティブコマンド

whatis

オブジェクトの型を調べるときに使う。

> whatis res[0]
<class 'dict'>

venv環境でwebサーバのように永続的に動くものをsystemdで起動する

venv環境は環境変数を切り替えた上でシンボリックリンクやコピーを使って仮想環境を構築しているので 、仮想環境にpipで依存ライブラリをインストールした後は、仮想環境内の /bin 以下に置かれた実行可能スクリプトを直接呼び出すだけで同様の動作にできる。

例えば以下のように systemd を使って起動できる。

[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target

[Service]
User=centos
Group=centos
PIDFile=/tmp/gunicorn.pid
Environment="PATH=/home/centos/venv/project-name-env/bin"
WorkingDirectory=/home/centos/project-name
ExecStart=/home/centos/venv/project-name-env/bin/gunicorn index:app --bind=0.0.0.0:8000 --reload
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

この点はRubyのbundlerと比較して簡単に書けるので好き。結婚したい。

その他

コーディングスタイルガイド

終わり

こんなところか。あとは適当にコード書いていけばいい気はする。

とりあえずPythonはマニュアル読めばだいたい書けそうだし、 ライブラリもそれなりに充実しているので、Webアプリケーションを作るくらいなら苦労はしなさそうだ。