異なるvirtualenv環境に多くの同じパッケージをインストールします。パッケージを一度ダウンロードして、ローカルキャッシュからpipをインストールする方法はありますか?
これにより、ダウンロードの帯域幅と時間が削減されます。
異なるvirtualenv環境に多くの同じパッケージをインストールします。パッケージを一度ダウンロードして、ローカルキャッシュからpipをインストールする方法はありますか?
これにより、ダウンロードの帯域幅と時間が削減されます。
回答:
ピップのドキュメントによると:
v6.0以降、pipはデフォルトでキャッシュを提供し、Webブラウザーのキャッシュと同様に機能します。キャッシュはデフォルトでオンになっており、デフォルトで正しく機能するように設計されていますが、キャッシュを無効にして、
--no-cache-dir
オプションを使用して常にPyPIにアクセスできます。
したがって、更新された答えは、ダウンロードキャッシュが必要な場合は、デフォルトでpipを使用することです。
ピップニュースから、バージョン0.1.4:
パッケージのダウンロードをキャッシュする環境変数$ PIP_DOWNLOAD_CACHEのサポートが追加されたため、今後のインストールでは大量のダウンロードは必要ありません。ネットワークアクセスは引き続き必要ですが、これを使用すると、一部のダウンロードのみが回避されます。
これを利用するために、以下をmyに追加しました~/.bash_profile
。
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
または、Macを使用している場合:
export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads
PIP_DOWNLOAD_CACHE
ディレクトリに追加されます。たとえば、私は今かなりの数のDjangoパッケージを持っています。virtualenvs
、飛行機の中で新しいものを作成するための答えではありませんが、それでも素晴らしいです。私の意見でpip2pi
は、はこの問題に対するはるかにエレガントで信頼できるソリューションです。
ドキュメントから:
pip2piは、pip要件からPyPI互換のパッケージリポジトリを構築します
pip2pi
次の2つの簡単なコマンドを使用して、独自のPyPIインデックスを作成できます。
パッケージとそのすべての要件をミラーリングするには、次を使用しますpip2tgz
。
$ cd /tmp/; mkdir package/
$ pip2tgz packages/ httpie==0.2
...
$ ls packages/
Pygments-1.5.tar.gz
httpie-0.2.0.tar.gz
requests-0.14.0.tar.gz
前のディレクトリからパッケージインデックスを作成するには:
$ ls packages/
bar-0.8.tar.gz
baz-0.3.tar.gz
foo-1.2.tar.gz
$ dir2pi packages/
$ find packages/
/httpie-0.2.0.tar.gz
/Pygments-1.5.tar.gz
/requests-0.14.0.tar.gz
/simple
/simple/httpie
/simple/httpie/httpie-0.2.0.tar.gz
/simple/Pygments
/simple/Pygments/Pygments-1.5.tar.gz
/simple/requests
/simple/requests/requests-0.14.0.tar.gz
手順2.で作成したインデックスからインストールするには、次のコマンドを使用するだけです。
pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
を使用して、独自のインデックスをリモートホストにミラーリングすることもできますpip2pi
。
pip2tgz
可能性もありますが、明示的に言及する価値があります。指定したディレクトリにパッケージを既にダウンロードしているかどうかを検出するため、同じインストール行または依存関係が重複する複数のインストール行を実行した場合、各パッケージは1回だけダウンロードされます。
新しいPipバージョンは、デフォルトでダウンロードをキャッシュするようになりました。このドキュメントを参照してください:
https://pip.pypa.io/en/stable/reference/pip_install/#caching
という名前の構成ファイルを作成し~/.pip/pip.conf
、次の内容を追加します。
[global]
download_cache = ~/.cache/pip
OS Xでは、~/Library/Caches/pip
他のOS Xプログラムが使用する規則に準拠しているため、選択する方が適切です。
pip.conf
とdownload_cache
設定同じシステム全体のディレクトリを指していることを。
PIP_DOWNLOAD_CACHEにはいくつかの深刻な問題があります。最も重要なのは、ダウンロードのホスト名をキャッシュにエンコードするため、ミラーの使用が不可能になることです。
pipダウンロードのキャッシュを管理するより良い方法は、「パッケージのダウンロード」ステップを「パッケージのインストール」ステップから分離することです。ダウンロードしたファイルは一般に「sdistファイル」(ソース配布)と呼ばれ、$ SDIST_CACHEディレクトリに保存します。
2つのステップは、次のようになります。
pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>
これにより、パッケージがダウンロードされ、$ SDIST_CACHEが指すディレクトリに配置されます。パッケージはインストールされません。そして、あなたは走ります:
pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name>
パッケージを仮想環境にインストールするには。理想的には、$ SDIST_CACHEはソース管理下でコミットされます。本番環境にデプロイする場合は、2番目のpipコマンドのみを実行して、パッケージをダウンロードせずにインストールします。
以降、バージョン6.0、pip
今それ自身のキャッシングを行います。
- DEPRECATION
pip install --download-cache
およびpip wheel --download-cache
コマンドラインフラグは非推奨になり、機能は削除されました。pipが自動的に構成して使用するようになったため--download-cache
、既存のオプションに代わる内部HTTPキャッシュが機能しなくなりましたが、pip v8.0で削除されるまで受け入れられます。詳細については、https://pip.pypa.io/en/latest/reference/pip_install.html#cachingを参照してください
上記のリンクの詳細:
v6.0以降、pipはデフォルトでキャッシュを提供し、Webブラウザーのキャッシュと同様に機能します。キャッシュはデフォルトでオンになっており、デフォルトで正しく機能するように設計されていますが、キャッシュを無効にして、
--no-cache-dir
オプションを使用して常にPyPIにアクセスできます。
pip wheelは、パッケージをプリコンパイルするという追加機能で必要なことを行う優れたオプションです。公式ドキュメントから:
要件(およびそのすべての依存関係)のホイールを構築します。
$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
これで、/tmp/wheelhouse
ディレクトリにすべての依存関係がプリコンパイルされたので、フォルダーを別のサーバーにコピーして、次のコマンドですべてをインストールできます。
$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
すべてのパッケージがマシン間で完全に移植できるわけではないことに注意してください。一部のパッケージは、使用しているPythonバージョン、OSディストリビューション、ハードウェアアーキテクチャ用に特別にビルドされます。これは-cp27-none-linux_x86_64
、64ビットLinux上のCPython 2.7 などのように、ファイル名で指定されます。
pipのみ(私のバージョンは1.2.1)を使用して、次のようにローカルリポジトリを構築することもできます。
if ! pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>; then
pip install --download-directory="$PIP_SDIST_INDEX" <package>
pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>
fi
pipの最初の呼び出しでは、要件ファイルのパッケージがローカルリポジトリ(のみ)で検索され、そこからインストールされます。それが失敗した場合、pipは通常の場所(PyPIなど)からパッケージを取得し、それをにダウンロードしますPIP_SDIST_INDEX
(ただし、何もインストールしません!)。ローカルインデックスからパッケージを正しくインストールするために、最初の呼び出しは「繰り返されます」。
(--download-cache
は完全な(エスケープされた)URLであるローカルファイル名を作成し、pipはこれをインデックスとして使用できません--find-links
。 --download-cache
キャッシュファイルが見つかった場合、それを使用します。このオプションをpipの2番目の呼び出しに追加できますが、インデックスは一種のキャッシュとしてすでに機能しているため、必ずしも多くのことをもたらすわけではありません。たとえば、インデックスが空になった場合に役立ちます。)
これには、pip-accelと呼ばれる新しいソリューションがあります。これは、pip
キャッシュが組み込まれたドロップイン置換です。
pip-accelプログラムは、Pythonパッケージマネージャであるpipのラッパーです。1つ以上の要件ファイルを指定して、Python仮想環境を初期化するためのpipの使用を加速します。これは、次の2つのアプローチを組み合わせることによって行われます。
ソース配布のダウンロードはキャッシュされ、ソース配布アーカイブのローカルインデックスを生成するために使用されます。
バイナリディストリビューションは、バイナリコンポーネント(M2CryptoやLXMLなど)との依存関係のインストールプロセスを高速化するために使用されます。これらの依存関係をすべての仮想環境で再コンパイルする代わりに、一度コンパイルして、結果をバイナリ* .tar.gzディストリビューションとしてキャッシュします。
Paylogicは、pip-accelを使用して、継続的にユニットテストを実行している継続的インテグレーションスレーブのファームの仮想環境を迅速かつ確実に初期化します(これは、pip-accelが開発された元の使用例の1つでした)。ビルドサーバーでも使用します。
からpip
への切り替えで約10倍の高速化が見られましたpip-accel
。
より簡単なオプションはbasket
です。
パッケージ名を指定すると、パッケージとすべての依存関係を中央の場所にダウンロードします。ピップキャッシュの欠点はありません。これはオフラインでの使用に最適です。
次に、このディレクトリをのソースとして使用できますpip
。
pip install --no-index -f file:///path/to/basket package
またはeasy_install
:
easy_install -f ~/path/to/basket -H None package
また、オンラインでバスケットを更新するときにも使用できます。