usercustomize による Python カスタマイズ

「サイボウズ・アドベントカレンダー2012」も、第2週に入りました。今週もバラエティに富んだ内容でお送りします(これまでの記事一覧)。


こんにちは。 Hazama チームの深谷です。

Hazama チームは cybozu.com のインフラ開発チームのことで、仮想マシンの操作や、各種モニタリング、バックアップ等のツール作りを行なっています。

今回は、Hazama が主に利用している Python の Tips という事で、usercustomize という仕組みについて紹介したいと思います。

そもそも usercustomize って?

usercustomize は site モジュールによって提供される機能の一つで、Python 起動時に任意のコードを実行することができます。

site モジュールには同様のことを行う sitecustomize という機能があります。

試しに次のファイルを sitecustomize.py という名前で /usr/lib/pythonX.Y/ に保存してみてください(X.Yは使っている Python のバージョンに置き換えてください) 。もしすでにファイルが存在する場合は、元のファイルをバックアップしておいてください。

print 'Hello, Python!'

保存したら、Python インタープリタを起動してみましょう。

どうでしょうか?いつものメッセージに加えて上記のメッセージが表示されたと思います。先ほどのファイルを usercustomize.py として保存しても同様に動作するはずです。試してみてください。

なぜ2つも同じ機能が提供されているのでしょうか? この理由を見ていきたいと思います。

sitecustomize と usercustomize

sitecustomize.py や usercustomize.py は /usr/lib/pythonX.Y/ 以外のパスに置くこともできます。

コマンドラインで次のコマンドを実行してみてください。

python -m site --user-site

何やらパスが表示されましたね。

Ubuntu をお使いなら /home/user_name/.local/lib/python2.7/site-packages のように表示されたと思います。

sitecustomize.py や usercustomize.py は site モジュールによって読み込まれますが、上記のパスもその候補となっているのです。

では先程テストに使った sitecustomize.py を上記のパスに配置して Python インタープリタを起動してみましょう。

どうですか?メッセージは表示されたでしょうか。

メッセージが表示されなかった場合は /usr/lib/pythonX.Y/usr/local/lib/pythonX.Y を調べてみましょう。すでに sitecustomize.py が存在するはずです。

わかった方もいると思いますが、この挙動はモジュールの検索順によるものです。sys モジュールをインポートして sys.path を見れば確認できます。

sitecustomize は usercustomize と異なりシステム全体の設定をカスタマイズする目的に使われます。そのため環境によっては、すでに優先順位の高いパスにファイルが配置されていることがあります。これでは僕の考えた最強のカスタマイズを行えません。

こんな時に活躍するのが usercustomize です。

usercustomize はその名の通りユーザー固有の設定を行う仕組みのため、普通はユーザーが作らないといけません。

そのためモジュールの検索順序を気にすることなく設定を書くことができます。

Hazama 流利用法

これで自由にカスタマイズを行えるようになったわけですが、usercustomize の使い方の一例として、Hazama でどう活用しているか紹介します。

cybozu.com の開発はお客様の環境とは独立した開発専用の環境で行なっています。しかし、お客様のデータがないとはいえ、PG や QA が利用しており、新しく作ったツールをエイヤッと適用すると、バグがあった時にみんな困ってしまいます。

そこで実際の適用前にツールの動作確認をするために、usercustomize を使って一時的にライブラリや設定ファイルの場所を書き換えてやります。

しかし、テストを行うときに毎回 usercustomize を配置したり削除するのは面倒です。テスト用のツールだけパスを書き換えて、運用しているツールは本来のパスを使うようにしたいのです。

幸いこのような仕組みを作ることは難しくありません。

運用に使っているツールが置いてあるディレクトリは固定されているので、それ以外のディレクトリで実行されたツールのみパスの書き換えを行えば要求を満たせます。実行パスの取得は sys.argv を見れば良いですね。

それでは usercustomize.py を下のようにして保存して Python インタープリタを起動してみましょう。

import sys
print sys.argv[0]

正常に起動出来ましたか?

私の環境(Ubuntu 12.04、Python 2.7.3)では下のようなメッセージが出て usercustomize が働きません。

'import usercustomize' failed; use -v for traceback

どうやら sys.argv の初期化のタイミングによるものらしいです。

ここからはバッドノウハウです。

Linux ではコマンドライン引数は /proc/pid/cmdline を参照すれば取得できます。引数は\0で区切られていることに注意すれば、ファイルの実行パスがわかります。

まとめ

今回は Python の usercustomize について紹介しました。

Python のカスタマイズには user モジュールも存在しますが、user をインポートしなくてはいけないですし、Deprecated なのでオススメできません。

usercustomize はユーザーごとに設定を変更でき、自動的に読み込まれるので、手軽にカスタマイズができて便利だと思います。

なにかの折に思い出していただけたらと思います。それでは!


明日は「cybozu.com運用」をお送りします。お楽しみに。