web-dev-qa-db-ja.com

「pipダウンロード」ですべての依存関係がダウンロードされるわけではありません

インターネットに接続されていないマシンにインストールするために再利用できるパッケージを含むローカルディレクトリをセットアップしようとしていますが、一部のパッケージで問題が発生しています。

最初にパッケージをダウンロードします

pip download -r requirements.txt -d my_packages --no-binary :all:

そして、私はそれらをインストールしようとします

pip install -r requirements.txt --no-index -f my_packages

インストールに問題があるパッケージの1つはelasticsearch-dsl==6.1.0です。

pip install -r requirements --no-index -f my_packages
Looking in links: my_packages
Collecting elasticsearch-dsl==6.1.0
Collecting six (from elasticsearch-dsl==6.1.0)
Collecting python-dateutil (from elasticsearch-dsl==6.1.0)
  Installing build dependencies ... error
  Complete output from command /Users/Oskar/.pyenv/versions/2.7.15/envs/no_internet/bin/python2.7 -m pip install --ignore-installed --no-user --prefix /private/var/folders/36/t0_t6_td2f560t2j0149vjmw0000gn/T/pip-build-env-moib0N --no-warn-script-location --no-binary :none: --only-binary :none: --no-index --find-links my_packages -- setuptools wheel:
  Looking in links: my_packages
  Collecting setuptools
    Could not find a version that satisfies the requirement setuptools (from versions: )
  No matching distribution found for setuptools

もちろん、setuptools手動でインストールできますが、他のすべてのパッケージに必要なパッケージよりも多くのパッケージがあります。 Django-guardian==1.4.9は、pytest-runnerを必要とする別の例で、何らかの理由でpip downloadでダウンロードされません。

11
Oskar Persson

_pip wheel_の代わりに_pip download_を使用して、依存関係を事前にダウンロードおよびコンパイルします。

_$ pip install wheel
$ pip wheel -w my_wheels python-dateutil --no-binary :all:
$ pip install -f my_wheels --no-index python-dateutil    # works
$ pip install -f my_packages --no-index python-dateutil  # breaks
_

_pip wheel_は_python-dateutil_パッケージをビルドするため、後で_setuptools_scm_の実行中に_pip install_を使用する必要はありません。

ドキュメントによると、

Wheelは組み込みパッケージ形式であり、インストールのたびにソフトウェアを再コンパイルしないという利点があります。

したがって、_pip wheel_は_setuptools_scm_などのビルド時の依存関係を使用しますが、_pip install_はビルドされているため、_.whl_は使用しません。

_--no-binary :all:_オプションは依然として正しいことを行います。バイナリ配布ではなく_.tar.gz_でソースをダウンロードします。

(jwodderは、実行時の依存関係i.e。 _install_requires_とビルド時の依存関係i.e。 _setup_requires_。)

私はこれをローカル環境でテストしましたが、_setuptools_scm_も_pytest-runner_もありません。問題ありません。

_(py3) j@computer:~/so-examples|⇒ pip freeze
Django-guardian==1.4.9
python-dateutil==2.7.3
six==1.11.0
_
7
James Lim

--no-binary :all:を指定したため、pipはパッケージのsdistのみをダウンロードし、ホイールはダウンロードしません。ただし、pipはインストール時に各パッケージのホイール形式を必要とするため、pip installはsdistから各パッケージのホイールを構築しようとします。この手順ではsetuptoolswheel、およびパッケージのsetup_requiresにリストされているすべてのもの。環境にsetuptoolsがない理由はわかりませんが、健全なPython環境には、環境の作成時にwheelの両方がインストールされている必要があります。

残念ながら、setup_requiresにリストされているパッケージは、pipではなくsetuptools自体によってインストールされるため、pip downloadにはこれらの要件を取り込む方法がありません。 --no-binary :all:の使用を主張する場合、唯一の解決策は、pip installの実行時に不足しているパッケージのリストを手動でコンパイルし、ダウンロードしてから、依存するパッケージの前に不足しているパッケージをインストールすることです。それらまたはそれ以外 my_packages)でダウンロードを探すようにsetuptoolsを構成します 。幸いにも、リストはかなり短くなる可能性があります(おそらくpytest-runnersetuptools_scmだけ)。

4
jwodder

pip2pi を使用して、ホイールの再発明を回避できます。これは、独自のPIPリポジトリを作成するための非常に便利なツールです。私は私のチームのために部分的なpypiミラーを維持しており、このプロジェクトで最高の結果を出しました。

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

$ pip install pip2pi
$ mkdir packages
$ pip2tgz packages/ -r requirements.txt
$ dir2pi -n packages/ # <--- this builds/updates the index, i.e. the "simple/" directory

次に、httpを通じてpackages/simple /フォルダーを提供し、それをインデックスとして使用します。

$ pip install -i http://myserver.net/simple/ -r requirements.txt

Pipのセキュリティチェックの煩わしさを回避するには、次のようにpip.confを調整できます。

[global]
format=columns
disable_pip_version_check = 1
index-url=file:http://myserver.net/simple/

これで、通常のpip installコマンドを使用して、自分のミラーからインストールできます。

2
MGP