[Python]pipの使い方
pipとは、Pythonにおけるパッケージ管理システムです。easy_installというツールもあるのですが、pipはこのeasy_installを置き換えるものとして開発されています。rubyのgem、perlのcpan的な位置づけです。
同じパッケージ管理ツールとしてsetuptools置き換えのdistributeというものもあるのですが、こちらはsetuptools全体を置き換えるものとして開発されており、pipはsetuptoolsの一部であるeasy_installを置き換える形です。
なお、現在のpipのバージョンは0.8.2で、このエントリはこのバージョンを使っています。
なにかおかしい点があれば、ご指摘ください。 > 識者の方々
pipのinstall
まずはeasy_installが必要です。これはsetuptoolsに入っています。portinstallやapt-get yeahやyum installなどでsetuptoolsを入れましょう。(もちろんdistributeでも構いません)
その後、pipをインストールします。
% easy_install pip
help
最初はhelpの出し方です。
% pip help # 全体的なhelpを表示
% pip help install # installに関するhelpを表示
% pip help freeze # freezeに関するhelpを表示
pypiを検索
pipは Python Package Index (pypi) にあるパッケージを検索することができます。それにはsearchを使います。
% pip search pycrypto
pycryptopp - Python wrappers for a few algorithms from the Crypto++ library
pycrypto - Cryptographic modules for Python.
INSTALLED: 2.3 (latest)
yawPyCrypto - yawPyCrypto wrapper library for PyCrypto
INSTALLEDと出ているように、すでにインストール済みのパッケージはその旨表示されます。
現在インストールされているパッケージを表示
freezeを使います。
% pip freeze
Cheetah==2.4.4
Jinja2==2.5.5
Markdown==2.0.3
MarkupSafe==0.11
pycrypto==2.3
freezeはファイルに標準出力で書き出して、あとでinstallやbundleに使えます。これに関しては後述します。
ちなみにvirtualenv環境では
virtualenv環境では-l(–local)を使うことで、global環境のパッケージは使われず、virtualenv環境でのみインストールされているパッケージのリストを得ることができます。–no-site-packagesを使ってvirtualenv環境を作ればいいんですけど。
% pip freeze -l
インストールする
installを使います。
% sudo pip install pycrypto
freezeしたパッケージを自動的にインストール
freezeで書き出しておいたパッケージリストを全部インストールします。書き出したパッケージリストは単なるテキストファイルなので、簡単に編集できます。依存性があるものも勝手にインストールされるので、必要な分だけ残しておけば大丈夫です。
% pip freeze > packages_ubuntu.txt
(必要ならばファイルを編集)
% pip install -r packages_ubuntu.txt
ちなみに、pip installを叩いた時点での最新版を入れたい場合は、バージョンを抜けば良いです。
MarkupSafe
pycrypto
proxyを設定する
% pip install pycrypto --proxy=user@proxy.example.jp:8080
Mirrorを使いたい
pypiが落ちている時や、もっと近くの場所から取ってきたい場合は–use-mirrorを使います。 -M でも大丈夫です。
% pip install pycrypto --use-mirror
あるいは、以下の環境変数を設定しておけば、-Mをつけなくても勝手にmirrorを使ってくれます。
% export PIP_USE_MIRRORS=true
Mirrorの場所は自動的に取得してきますが、–mirrorsを使って上書きもできます。
なお、Mirrorに関してはPEP 381に記載されています。http://www.python.org/dev/peps/pep-0381/
ユーザーディレクトリにインストールする
rootがない環境などでは、ユーザディレクトリにインストールすることしかできません。そのためには、–userをつけます。
% pip install pycrypto --user
このように –user をつけてインストールすると、 ~/.local/ 以下に置かれます。~/.local/bin などにPATHを通しておかないとあれーってことになりますので、ご注意を。
なお、これをするぐらいなら、後述のVirtualEnv環境を作ったほうがいいと思われます。
特定のバージョンをインストールする
特定のバージョンをインストールすこともできます。
% pip install Django==1.1.1
freezeで書き出したパッケージファイルはこの形式のため、freezeの名のとおり、書き出されたときのバージョンがインストールされることに注意してください。
バージョンの指定方法はわりと柔軟でこんなこともできます。
% pip install 'Markdown<2.0'
この場合、すでに2.0以上のバージョンがインストールされている場合は、それをuninstallして<2.0を満たすバージョンをインストールしてくれます。
また、
% pip install 'Markdown>2.0,<2.0.3'
とかもできます。
Subversion/git/mercurial/bazaarから直接インストールする
レポジトリから直接インストールすることもできます。
% pip install -e svn+http://myrepo/svn/MyApp#egg=MyApp # subversion
% pip install -e git+http://myrepo/svn/MyApp#egg=MyApp # git
% pip install -e hg+http://myrepo/svn/MyApp#egg=MyApp # mercurial
% pip install -e bzr+http://myrepo/svn/MyApp#egg=MyApp # bazaar
% pip install -e bzr+http://myrepo/svn/MyApp#egg=MyApp@275 # revision 275からインストール
インストールせずに試してみる
なにがダウンロードされてどうなるのか、を事前に確かめたいことがあります。そのためには、 –no-install をつけます。
% pip install pycrypto --no-install
なお、 –no-installは手でパッチを当てたい場合にも使えます。–no-installをすると、VirtualEnvディレクトリのbuild以下に展開されます。ここで変更を加えた後、
% pip install pycrypto --no-download
とすると、インストールされます。–no-downloadを付けないと、もう一度downloadして変更が失われてしまうので注意です。
もう一度インストールしたい
この場合、-I (–ignore-installed)を使います。
% pip install pycrypto -I
アップグレードしたい
一度インストールしたパッケージをアップグレードする場合には、-U (–upgrade)を使います。
% pip install pycrypto -U
virtualenv環境にインストールする
後述するように、activateしてvirtualenv環境でpipを実行しても良いのですが、直接パッケージを入れ込むこともできます。
% pip install -E pip_test_env/ pycrypto
uninstallする
uninstallを使います。
% pip uninstall pycrypto
ちなみに、 -y をつけると、すべての問いに yes と答えます。たまに有用ですが、気をつけて使ってください。
bundleする
bundleとは、パッケージを一つに固めたものです。これを使うことにより、ネットワークがない場所でもパッケージをインストールすることができます。
% pip freeze > packages.txt
% pip bundle -r packages.txt rudi.pybundle # bundle作成
% pip install rudi.pybundle # bundleからインストール
これでfreezeで書き出したパッケージを固めた、 rudi.pybundle という名前のファイルができます。ちなみに、この実体はzipファイルです。
あ、.pybundleと名前につけておかないとあとでエラーになるようです。
virtualenvとの組み合わせ
virtualenvは、OSの環境と切り離された仮想的な環境を作ることができます。virtualenv環境にpipを使ってパッケージをインストールする事で、OS環境を破壊することなく環境が構築できます。
インストールにはこうします。
% pip install virtualenv
virtualenv環境の判定
virtualenv環境でのみpipを動かしたい場合、この環境変数を設定します。
% export PIP_REQUIRE_VIRTUALENV=true
こうしておくとvirtualenv環境ではない場合、”Could not find an activated virtualenv (required).”と言われて怒られます。
virtualenv環境であればそっちを、なければglobalを使うようにするためには、
% export PIP_RESPECT_VIRTUALENV=true
とします。両方共trueになっている場合は、 REQUIRE の方が優先されます。(つまり、virtualenv環境でないと怒られる)
virtualenv環境での使い方
まずはvirtualenv環境を作成します。おっと、–userとかでvirtualenvをインストールした場合、ちゃんとPATHを通しておいてくださいね。
% virtualenv --no-site-packages --distribute pip_test_env
このコマンドで pip_test_envというディレクトリができます。 –no-site-packagesオプションはglobalなパッケージを使わなくする設定です。
また、 –distributeオプションはsetuptoolsの代わりにdistributeを使うオプションです。いちいち打つのがめんどくさい人は、
% export VIRTUALENV_USE_DISTRIBUTE=true
と環境変数を設定してください。
なお、後述のvirtualenvwrapperを使う場合は、別のコマンドになりますのでご注意を。
では、virtualenv環境に入りましょう。
% cd pip_test_env
% . pip_test_env/bin/activate # 最初に . を打ってます
(pip_test_env)% # 成功
ちなみに、 ”.” は shellにbuiltinされているコマンドで、指定したファイルの環境を現在のshellの環境に組み込みます。詳しくは man zshbuiltins で。あるいは、 source コマンドを使っても構いません。
pipでインストール
pipはすでにvirtualenv環境に用意されており、さらにPATHも通っています。
% which pip
/home/hoge/tmp/pip_test_env/bin/pip
% pip install sphinx
(snip)
% which sphinx-build
/home/hoge/tmp/pip_test_env/bin/sphinx-build
さて、パッケージを普通にインストールしてもいいのですが、ここでbundleの出番です。bundleしておいたファイルをここでインストールすれば、元の環境を変更することなく、簡単に開発環境を用意できるというわけです。もちろんバージョンも同じです。
% source pip_test_env/bin/activate
(pip_test_env)% pip install rudi.pybundle
virtualenv環境からの脱出
単に deactivate と打てばいいです。deactivateは activateの中で定義されています。
(pip_test_env)% deactivate
%
virtualenvwrapperとの連携
virtualenvwrapper を使うと、virtualenv環境を複数使い分けるときに便利です。
簡単に書くと、 * mkvirutualenvでvirtualenv環境を作成 * workon (名前)で任意のvirtualenv環境に切り替え です。
詳しくは上記リンクを参照してください。
buildoutとの連携
gp.recipe.pip を参照。
pipの制限
- .eggからのインストールはできません
- 複数バージョンのパッケージを管理できません * その場合はvirtualenvを使って環境を切り変えてください
- Setuptools extras (package[test]など)は理解できません
- setup.pyをdistutils や setuptools 用として強烈にカスタマイズしていると理解できないことがあります
[読了]ライト、ついてますか
[asin:4320023684:detail]
某ぽに勧められて、「ライト、ついてますか」という本を読んだ。いろいろと面白いことが書かれてあったのでここにメモします。自分用のメモで書評じゃないので、その点を注意して欲しいです。
問題とは
「問題とは、望まれた事柄と認識された事柄の間の相違である」
従って、問題を解決する方法は二種類ある。 * 1. 望みを変える * 2. 認識を変える
この2については結構気がつかないことが多い。
問題はなんなのか
問題を持ちかけられたからといって、それが本当に問題とは限らない。
「彼らの解決方法を問題の定義と取り違えるな」
そしてもう一つ。
「正しい問題定義が得られたという確信は決して得られない。(問題が解けた後でも)
だが、その確信を得ようとする努力は決してやめてはいけない」
「問題はなにか?」は常に自問自答し続けなければならない。
認識
「問題によってはそれを認識するところが一番難しいこともある」
問題は欲求と認識との相違であるため、欲求がそもそもなければ問題ではない。しかし、別の人に取っては異なる。
「キミの問題定義を外国人や盲人や子供について試してみよう。
またキミ自身が外国人や盲人や子供になってみよう」
これにより、別の問題が浮かび上がってくるかもしれない。「新しい視点は必ず新しい不適合を作り出す」。
言葉
認識を変える簡単な方法の一つは言葉を使うこと。
「問題が言葉の形になったら、それがみんなの頭に入るまで言葉をもて遊んでみよう」
「Mary had a little lamb」
という言葉があったとき、各単語を強調してみる。強調した単語を、「ほんとに?」と考えてみる。
- <span class=”deco” style=”font-weight:bold;”>MARY</span> had a little lamb
- Mary <span class=”deco” style=”font-weight:bold;”>HAD</span> a little lamb
- Mary had <span class=”deco” style=”font-weight:bold;”>A </span>little lamb
- Mary had a <span class=”deco” style=”font-weight:bold;”>LITTLE</span> lamb
- Mary had a little <span class=”deco” style=”font-weight:bold;”>LAMB</span>
一単語だけじゃなくて連続した複数の単語でもいい。
辞書方式
各単語について意味を類語辞書をひき、違うけど同じ意味の言葉にしてみる。
言葉遊びのゴールデン・リスト
- 強調の置き場所を変えてみる (上述)
- 肯定を否定に、否定を肯定に変えてみる
- 「てもよい(may)」を「なければならない(must)」に変えてみる。またその逆
- 「または(or)」を「と…の一方(either or」に変えてみる。またその逆
- 「および(and)」を「または(or)」に変えてみる。またその逆
- 積極的に定義が与えられている術語を選んで、文中のそれが現れた場所を定義の文句で置き換えてみる
- 「等」「以下同様」「ほか」などとあったら、そこにもう一つ実例を付け加えてみる
- 説得的な言葉(「明らかに(obviously)」、「ゆえに(therefore)」、「明瞭に(clearly)」、「確かに(certanly)」など)を探して、それらが代表しているはずの論証でそれらを置き換えてみる
- 文またはパラグラフが表しているものを絵に描いてみようとする
- 言葉で書いてあるものを式で表す
- 式を言葉で表す
- 図がなにをいっているかを言葉で表す
- 「読者(you)」を「筆者(me)」で置き換える
- 「筆者(me)」を「読者(you)」で置き換える
- 「われわれ(we)」と「読者(you)」を「双方(both parties)」で置き換える
- 「一つの(a)」を「その(the)」で置き換える。またその逆
- 「一部の(some)」を「全部の(every)」で置き換える。またその逆
- 「つねに(always)」を「あるとき(sometime)」で置き換える
- 「あるとき(sometime)」を「決して…ない(never)」で置き換える
理解
「他人が自分の問題を自分で完全に解けるときに、それを解いてやろうとするな」
問題を解決できるなら首を突っ込まないほうがいい。そのほうがいい結果になるし、モチベーションがある。そして、
「もしそれが彼らの問題なら、それを彼らの問題にしてしまえ」
自分の問題ならやる気が出るよね。そしてこれの発展形。
「もしある人物が問題に関係あって、しかもその問題を抱えていないなら、
何かをやってそれをその人物の問題にしてしまおう」
巻き込んでしまえ。
気づき
相手がすでにそれなりの知識・経験がある場合、ごちゃごちゃと問題の可能性を指摘するより、注意を喚起して気づかせたほうが良い場合がある。
ライト、ついてますか?
本当にその問題を解きたいか?
問題だと思ってたことは実は問題じゃなかった、あるいは、問題が違ってた、ということは良くある。
「人々は、くれといったものを出してやるまでは何が欲しかったかを知らぬものである」