pipを使用してローカルキャッシュからインストールするにはどうすればよいですか?


142

異なるvirtualenv環境に多くの同じパッケージをインストールします。パッケージを一度ダウンロードして、ローカルキャッシュからpipをインストールする方法はありますか?

これにより、ダウンロードの帯域幅と時間が削減されます。


1
pip 6.0(2014-12-22)以降、pipはデフォルトでキャッシュされることに注意してください。詳細については、pip.pypa.io / en / stable / reference / pip_install.html#cachingを参照してください。
Pi Delport、2015

ダウンロード帯域幅の時間を削減するだけでなく、パッケージの利用可能なバージョンを確認するためにPyPIインデックスをクロールするのに費やす時間を排除できます。ホイールをキャッシュしている場合は、それらを提供しないパッケージのホイールを構築するのに費やす時間を排除できます。 。合計すると、速度が大幅に向上します。
ジョナサンハートレー

回答:


125

回答の更新19-Nov-15

ピップのドキュメントによると:

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

ノート

  1. 新しいバージョンのパッケージが検出された場合、パッケージがダウンロードされ、PIP_DOWNLOAD_CACHEディレクトリに追加されます。たとえば、私は今かなりの数のDjangoパッケージを持っています。
  2. これは、pipニュースで述べられているように、ネットワークアクセスの必要性を取り除きません。そのためvirtualenvs、飛行機の中で新しいものを作成するための答えではありませんが、それでも素晴らしいです。

4
ログイン中にのみbash_profileが実行されるため、それを.bashrcに入れる方がいいかもしれません。それはあなた次第で、とにかくそれは良いアドバイスです:)
Nikita Hismatov

1
Macでは、シェルの最初にロードされます。
saul.shanabrook

3
PIP_DOWNLOAD_CACHEには重大な欠陥があり、パッケージをデプロイメントマシンに配布するような場合に使用することはお勧めしません。また、到達可能なpypi.python.orgにも依存しています。ローカル開発キャッシュには最適ですが、より頻繁な使用には適していません。
レイシー

1
@slacyなぜひどい欠陥があるのか​​コメントしていただけますか?PyPIに到達可能にしたくない場合は、それが--no-indexの目的です。ダウンロードキャッシュは確実にPyPIに到達するかどうかに直交しています。
lvh

以下の @lvh slacyの回答は、Pipのダウンロードキャッシュに欠陥がある理由を説明しています。キャッシュを有効にすると、奇妙なことに、pipのインストールに時間がかかることもわかりました。pip-accelバスケットがより良いオプションのようです。
qris

52

私の意見でpip2piは、はこの問題に対するはるかにエレガントで信頼できるソリューションです。

ドキュメントから:

pip2piは、pip要件からPyPI互換のパッケージリポジトリを構築します

pip2pi 次の2つの簡単なコマンドを使用して、独自のPyPIインデックスを作成できます。

  1. パッケージとそのすべての要件をミラーリングするには、次を使用します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
    
  2. 前のディレクトリからパッケージインデックスを作成するには:

    $ 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
    
  3. 手順2.で作成したインデックスからインストールするには、次のコマンドを使用するだけです。

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
    

を使用して、独自のインデックスをリモートホストにミラーリングすることもできますpip2pi


+1 pip2pipはうまくいきます!! ネットワーク接続にそれほど依存するのは好きではありません。最も必要なときに失敗します。
MGP 2013年

これはうまく機能し、私の質問stackoverflow.com/questions/18052217/…に回答します。
Larry Cai

1
暗黙であるpip2tgz可能性もありますが、明示的に言及する価値があります。指定したディレクトリにパッケージを既にダウンロードしているかどうかを検出するため、同じインストール行または依存関係が重複する複数のインストール行を実行した場合、各パッケージは1回だけダウンロードされます。
2014年

32

新しいPipバージョンの場合:

新しいPipバージョンは、デフォルトでダウンロードをキャッシュするようになりました。このドキュメントを参照してください:

https://pip.pypa.io/en/stable/reference/pip_install/#caching

古いPipバージョンの場合:

という名前の構成ファイルを作成し~/.pip/pip.conf、次の内容を追加します。

[global]
download_cache = ~/.cache/pip

OS Xでは、~/Library/Caches/pip他のOS Xプログラムが使用する規則に準拠しているため、選択する方が適切です。


また、同じPCの他のユーザーがアクセスできるようにグローバルに保存したい場合はどうすればよいですか。どうすればいいですか?設定ファイルは/ etcか何かに配置する必要があると思います。
Batandwa 2014年

@batandwa:うまくいくかもしれません。すべてのユーザーが持っていることを確認してください:いない場合、あなたはこれを試みることができるpip.confdownload_cache設定同じシステム全体のディレクトリを指していることを。
Flimm 2014年

28

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コマンドのみを実行して、パッケージをダウンロードせずにインストールします。


Gabriel-2回ダウンロードされるのではなく、最初のステップで1回だけダウンロードされ、次に2番目のステップでローカルキャッシュからインストールされます。何を見てるの?
レイシー

最初のステップを2回実行すると、2回ダウンロードされますよね?少なくともここで起こった。このパッケージの最初のステップは、実行する前に少なくとも1回は実行されていることを知っておく必要があります。そうしないと、同じファイルが2回ダウンロードされます。実行する必要があるか、以前にダウンロードしたことがあるかを確認するにはどうすればよいですか?
GabrielJordão2012

他の答えが示唆するように、おそらくあなたは単にpip2piを使用したいだけです。:)
slacy '26

これは依存関係もダウンロードしますか?
monkut 2013

私はpip 18.1を使用していますが、オプション--no-installがありません。この回答を更新する方法に関するアイデアはありますか?
paolof89

13

以降、バージョン6.0pip今それ自身のキャッシングを行います。

  • 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にアクセスできます。


9

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 などのように、ファイル名で指定されます。


3

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番目の呼び出しに追加できますが、インデックスは一種のキャッシュとしてすでに機能しているため、必ずしも多くのことをもたらすわけではありません。たとえば、インデックスが空になった場合に役立ちます。)


3

これには、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


2

より簡単なオプションはbasketです。

パッケージ名を指定すると、パッケージとすべての依存関係を中央の場所にダウンロードします。ピップキャッシュの欠点はありません。これはオフラインでの使用に最適です。

次に、このディレクトリをのソースとして使用できますpip

pip install --no-index -f file:///path/to/basket package

またはeasy_install

easy_install -f ~/path/to/basket -H None package

また、オンラインでバスケットを更新するときにも使用できます。


制限(公式ページから):バスケットはソース配布のみをダウンロードします。PyPIでホストされていないパッケージはダウンロードできず、バージョン要件(「nose> = 1.1.2」など)を無視し、常に最新バージョンをダウンロードします。
hdiogenes

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.