150

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

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

4

11 に答える 11

127

回答を更新2015年11月19日

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

ノート

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

私の意見で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

于 2012-09-21T06:40:59.753 に答える
33

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

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

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

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

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

[global]
download_cache = ~/.cache/pip

~/Library/Caches/pipOS Xでは、他のOS Xプログラムが使用する規則に従っているため、より適切な方法を選択できます。

于 2013-04-11T12:22:32.177 に答える
31

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

于 2012-08-27T18:23:34.963 に答える
13

バージョン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にアクセスできます。

于 2014-12-29T04:40:06.807 に答える
9

ピップホイールは、パッケージを事前にコンパイルするという追加機能を使用して、必要な処理を実行する優れたオプションです。公式ドキュメントから:

要件(およびそのすべての依存関係)に対応するホイールを作成します。

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

于 2014-12-29T21:27:55.263 に答える
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番目の呼び出しに追加できますが、インデックス以降すでに一種のキャッシュとして機能しているので、必ずしも多くをもたらすとは限りません。たとえば、インデックスが空の場合に役立ちます。)

于 2012-12-10T12:21:39.110 に答える
3

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

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

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

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

またはeasy_install

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

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

于 2014-03-22T11:05:44.173 に答える
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

于 2014-10-02T13:50:33.133 に答える
0

パッケージ「pip-accel」は良い選択だと思います。

于 2018-06-11T02:03:15.017 に答える
0

パッケージをダウンロードして、それらのダウンロードからインストールする場合は、次のことが便利であることがわかりました。

pip download -d "$SOME_DIRECTORY" some-package

次にインストールするには:

pip install --no-index --no-cache-dir --find-links="$SOME_DIRECTORY"

$SOME_DIRECTORYパッケージをダウンロードするディレクトリへのパスはどこにありますか。

于 2021-05-25T22:52:26.903 に答える