インターネットに接続されていないマシンにインストールするために再利用できるパッケージを含むローカルディレクトリをセットアップしようとしていますが、一部のパッケージで問題が発生しています。
最初にパッケージをダウンロードします
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
でダウンロードされません。
_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
_
--no-binary :all:
を指定したため、pipはパッケージのsdistのみをダウンロードし、ホイールはダウンロードしません。ただし、pipはインストール時に各パッケージのホイール形式を必要とするため、pip install
はsdistから各パッケージのホイールを構築しようとします。この手順ではsetuptools
、wheel
、およびパッケージのsetup_requires
にリストされているすべてのもの。環境にsetuptools
がない理由はわかりませんが、健全なPython環境には、環境の作成時にwheel
の両方がインストールされている必要があります。
残念ながら、setup_requires
にリストされているパッケージは、pipではなくsetuptools
自体によってインストールされるため、pip download
にはこれらの要件を取り込む方法がありません。 --no-binary :all:
の使用を主張する場合、唯一の解決策は、pip install
の実行時に不足しているパッケージのリストを手動でコンパイルし、ダウンロードしてから、依存するパッケージの前に不足しているパッケージをインストールすることです。それらまたはそれ以外 my_packages
)でダウンロードを探すようにsetuptoolsを構成します 。幸いにも、リストはかなり短くなる可能性があります(おそらくpytest-runner
とsetuptools_scm
だけ)。
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
コマンドを使用して、自分のミラーからインストールできます。