この投稿で作成する環境は https://bitbucket.org/toruuetani/venv_base
で構築できる。
hg clone
して cmd.bat
を実行すると、 Fabric がインストールされた virtualenv 環境が構築される。
前提
windows PC で開発し、それを動作させるのは別の windows PC 。ただし、その PC はオフライン環境で動作する。
なぜ今頃 pip を使いだすのか
pip はバイナリからインストールできないから。
pure python でないパッケージはソースからコンパイルしないといけないが、 linux と違って windows には C コンパイラがないことが多いため、 そういうパッケージをインストールできない。そのため windows 向けにバイナリパッケージが用意されている(XXX-1.2.1.win32-py2.7.exe など)。このバイナリパッケージは easy_install なら問題なくインストールできるが、 pip ではインストールできない。
そのため pip がいくら進化しようと、 windows では easy_install 一択だった。
上記のような状況は wheel の登場により改善されてきている。 wheel フォーマットはバイナリも含められるため、特殊なパッケージ( pywin32, psycopg2, py2exeなど )を除いては、ほぼ pip だけで行けるようになっている。
2014/02/14 追記
-> ここで記述したが、 wininst2wheel でより easy_install から pip への移行が可能になっている。
モダンな環境構築
現在 virtualenv を使わない環境は考えられないので、当然使うことにする。
- python 2.7.6
- virtualenv 1.11.2
- setuptools 2.1
- pip 1.5.2
- wheel 0.22.0
以下の説明では次のディレクトリを使う。
- $ 作業ディレクトリ
- VENV_DIR virualenv 環境の構築ディレクトリ $/tools/venv
- WHEELHOUSE_DIR wheel 格納ディレクトリ $/tools/setup/wheelhouse
virtualenv 環境の構築
https://pypi.python.org/pypi/virtualenv/ から virtualenv-1.11.2.tar.gz をダウンロードして解凍すると、以下のようなファイルができるのでこれを使う。
- virtualenv.py
- virtualenv_support/pip-1.5.2-py2.py3-none-any.whl
- virtualenv_support/setuptools-2.1-py2.py3-none-any.whl
python virtualenv.py %VENV_DIR%
これで easy_install, pip が使えるようになる。
wheel のインストール
https://pypi.python.org/pypi/wheel/ から wheel-0.22.0.tar.gz をダウンロードして使う。
pip install wheel-0.22.0.tar.gz
これで wheel フォーマットが使えるようになる。
wheel の作り方
慣習的に wheel は wheelhouse というディレクトリに格納するので、これに倣っておく。
pip wheel %PACKAGE_NAME% -w "%WHEELHOUSE_DIR%"
たとえば Fabric の wheel を作る場合は以下のようにする。
pip wheel Fabric -w "%WHEELHOUSE_DIR%"
そうすると依存関係を解決して wheel を作成してくれる。
- ecdsa-0.10-py27-none-any.whl
- paramiko-1.12.1-py27-none-any.whl
- pycrypto-2.6.1-cp27-none-win32.whl
- Fabric-1.8.1-py2.py3-none-any.whl
(注)現時点の pip には バグ があるため、 PyPI に登録されていると作成してくれない。したがって Fabric-1.8.1-py2.py3-none-any.whl のみ PyPI からダウンロードする。
wheel を使ったインストール
pip wheel
は wheel を作るだけなので、 実際インストールするには pip install
を使って
pip install "%WHEELHOUSE_DIR%\Fabric-1.8.1-py2.py3-none-any.whl"
のようにする。この状態で pip freeze
すると現在インストールされているパッケージが表示される。
> pip freeze
Fabric==1.8.1
ecdsa==0.10
paramiko==1.12.1
pycrypto==2.6.1
wheel==0.22.0
pip には pip freeze
の結果をもとにパッケージをインストールする仕組みがある。上記結果を requirements.txt として保存するとパッケージを一括でインストールできる。なお、 wheel を作成済みで PyPI を検索する必要はないため、 --no-index
をつけておく。
ある程度パッケージが多くなったら、こちらの方法が便利だろう。
pip install -r requirements.txt -f "%WHEELHOUSE_DIR%" --no-index
まとめ
wheelhouse に格納した wheel があれば、オフライン環境でも環境は構築できる。現状ではまだ一部 easy_install に頼らざるを得ないが、十分実用的と言えるだろう。