異なるvirtualenv環境に同じパッケージをたくさんインストールします。パッケージを一度ダウンロードしてから、ローカルキャッシュからpipをインストールする方法はありますか?
これにより、ダウンロードの帯域幅と時間が削減されます。
異なるvirtualenv環境に同じパッケージをたくさんインストールします。パッケージを一度ダウンロードしてから、ローカルキャッシュからpipをインストールする方法はありますか?
これにより、ダウンロードの帯域幅と時間が削減されます。
Pipのドキュメントによると:
v6.0以降、pipはデフォルトでonを提供します。これは、Webブラウザーと同様に機能します。キャッシュはデフォルトでオンになっていて、デフォルトで正しいことを行うように設計されていますが、
--no-cache-dir
オプションを利用することで、キャッシュを無効にし、常にPyPIにアクセスできます。
したがって、更新された答えは、ダウンロードキャッシュが必要な場合は、デフォルトでpipを使用することです。
ピップニュース、バージョン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
~/Library/Caches/pip
OS Xでは、他のOS Xプログラムが使用する規則に従っているため、より適切な方法を選択できます。
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は、既存のオプションに代わる内部HTTPキャッシュを自動的に構成して使用するようになったため--download-cache
、機能しなくなりましたが、pipv8.0で削除されるまで引き続き受け入れられます。詳細については、https://pip.pypa.io/en/latest/reference/pip_install.html#cachingを参照してください。
上記のリンクからの詳細情報:
v6.0以降、pipはデフォルトでonを提供します。これは、Webブラウザーと同様に機能します。キャッシュはデフォルトでオンになっていて、デフォルトで正しいことを行うように設計されていますが、
--no-cache-dir
オプションを利用することで、キャッシュを無効にし、常にPyPIにアクセスできます。
ピップホイールは、パッケージを事前にコンパイルするという追加機能を使用して、必要な処理を実行する優れたオプションです。公式ドキュメントから:
要件(およびそのすべての依存関係)に対応するホイールを作成します。
$ 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番目の呼び出しに追加できますが、インデックス以降すでに一種のキャッシュとして機能しているので、必ずしも多くをもたらすとは限りません。たとえば、インデックスが空の場合に役立ちます。)
より簡単なオプションは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
からへの切り替えから約10倍のスピードアップが見られましたpip-accel
。
パッケージ「pip-accel」は良い選択だと思います。
パッケージをダウンロードして、それらのダウンロードからインストールする場合は、次のことが便利であることがわかりました。
pip download -d "$SOME_DIRECTORY" some-package
次にインストールするには:
pip install --no-index --no-cache-dir --find-links="$SOME_DIRECTORY"
$SOME_DIRECTORY
パッケージをダウンロードするディレクトリへのパスはどこにありますか。