同じパッケージをたくさん virtualenv 環境にインストールします。パッケージを一度ダウンロードしてから、ローカルキャッシュから pip をインストールする方法はありますか?
これにより、ダウンロードの帯域幅と時間が削減されます。
Pipドキュメント によると:
V6.0以降、pipはデフォルトでオンになり、Webブラウザーのキャッシュと同様に機能します。キャッシュはデフォルトでオンになっており、デフォルトで正しいことを行うように設計されていますが、キャッシュを無効にし、
--no-cache-dir
オプションを使用して常にPyPIにアクセスできます。
したがって、更新された答えは、ダウンロードキャッシュが必要な場合、デフォルトでpipを使用することです。
pip news 、バージョン0.1.4から:
パッケージのダウンロードをキャッシュする環境変数$ PIP_DOWNLOAD_CACHEのサポートを追加しました。これにより、今後のインストールで大量のダウンロードが不要になります。ネットワークアクセスは引き続き必要ですが、これを使用する場合、一部のダウンロードのみが回避されます。
これを利用するために、以下を~/.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
を使用して、独自のインデックスをリモートホストにミラー化することもできます。
新しいPipバージョンは、デフォルトでダウンロードをキャッシュします。このドキュメントを参照してください。
https://pip.pypa.io/en/stable/reference/pip_install/#caching
~/.pip/pip.conf
という名前の構成ファイルを作成し、次の内容を追加します。
[global]
download_cache = ~/.cache/pip
OS Xでは、他のOS Xプログラムが使用する規則に従っているため、選択するのに適したパスは~/Library/Caches/pip
です。
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. 以降、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はデフォルトでonを提供します。これは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ディストリビューション、および/または使用しているハードウェアアーキテクチャ用に特別にビルドされます。これは、CPythonの-cp27-none-linux_x86_64
のように2.7 64ビットLinuxなど。
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
は、キャッシュファイルが見つかった場合はそれを使用します。インデックスは既に一種のキャッシュとして機能しているため、必ずしも多くをもたらすとは限りません。たとえば、インデックスが空になっている場合に役立ちます。
より単純なオプションは basket
です。
パッケージ名を指定すると、それとすべての依存関係が中央の場所にダウンロードされます。 pipキャッシュの欠点はありません。これはオフラインでの使用に最適です。
その後、このディレクトリをpip
のソースとして使用できます。
pip install --no-index -f file:///path/to/basket package
または easy_install
:
easy_install -f ~/path/to/basket -H None package
また、オンラインのときにバスケットを更新するために使用することもできます。
これには、 pip-accel と呼ばれる新しいソリューションがあります。これは、キャッシュが組み込まれたpip
のドロップイン置換です。
Pip-accelプログラムは、Pythonパッケージマネージャーであるpipのラッパーです。 1つ以上の要件ファイルを指定して、Python仮想環境を初期化するためにpipの使用を高速化します。これは、次の2つのアプローチを組み合わせることで実現します。
ソース配布のダウンロードはキャッシュされ、ソース配布アーカイブのローカルインデックスを生成するために使用されます。
バイナリ配布は、バイナリコンポーネント(M2CryptoやLXMLなど)を使用して依存関係をインストールするプロセスを高速化するために使用されます。すべての仮想環境でこれらの依存関係を再コンパイルする代わりに、それらを一度コンパイルし、結果をバイナリ* .tar.gzディストリビューションとしてキャッシュします。
Paylogicはpip-accelを使用して、常に単体テストを実行している連続統合スレーブのファームの仮想環境を迅速かつ確実に初期化します(これはpip-accelが開発された元のユースケースの1つでした)。ビルドサーバーでも使用します。
pip
からpip-accel
への切り替えにより、約10倍の速度向上が見られました。
パッケージ「pip-accel」は良い選択に違いないと思います。