web-dev-qa-db-ja.com

依存関係宣言がないパッケージ(scipyなど)のビルドホイール

ここでは違いはないと思いますが、Python 2.7。

したがって、私の質問の一般的な部分は次のとおりです。各プロジェクトに個別のvirtualenvを使用します。管理者アクセス権がなく、システムにインストールされたパッケージをいじりたくありません。当然、ホイールを使用してvirtualenvs全体のパッケージのアップグレードとインストールを高速化したいと思います。特定のvirtualenv内でのみ依存関係が満たされるホイールを作成するにはどうすればよいですか?

具体的には、発行

pip wheel -w $WHEELHOUSE scipy

失敗する

Building wheels for collected packages: scipy
  Running setup.py bdist_wheel for scipy
  Destination directory: /home/moritz/.pip/wheelhouse
  Complete output from command /home/moritz/.virtualenvs/base/bin/python -c "import setuptools;__file__='/home/moritz/.virtualenvs/base/build/scipy/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /home/moritz/.pip/wheelhouse:
  Traceback (most recent call last):

  File "<string>", line 1, in <module>

  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 237, in <module>

    setup_package()

  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 225, in setup_package

    from numpy.distutils.core import setup

ImportError: No module named numpy.distutils.core

----------------------------------------
  Failed building wheel for scipy
Failed to build scipy
Cleaning up...

numpyはグローバルに存在せず、virtualenvがインストールされたnumpyがアクティブな場合にホイールの構築が機能するため、特定のvirtualenvnumpyのバージョン。

pandasにも依存するnumpyは、numpyの独自のコンポーネントをインストールするように見えますが、それが最善のソリューションであるかどうかはわかりません。

numpy--userとともにインストールし、それを使用してscipyホイールを構築できます。より良いオプションはありますか?

15
Midnighter

問題の説明

  • pythonパッケージ(scipyなど)、他のパッケージ(numpyなど)に依存していますが、setup.pyはその要件を宣言していません/依存。
  • そのようなパッケージ用のホイールの構築は、現在の環境が必要なパッケージを提供する場合に成功します。
  • 必要なパッケージが利用できない場合、ホイールの構築は失敗します。

注:理想的な解決策は、必要なパッケージ宣言を追加して、壊れたsetup.pyを修正することです。しかし、これはほとんど実行不可能であり、別の方法で対処する必要があります。

解決策:最初に必要なパッケージをインストールします

手順(scipyを必要とするnumpyのインストール)には2つのステップがあります

  1. 車輪を組み立てる
  2. ホイールを使用して必要なパッケージをインストールします

必要な車輪を操舵室に配置する

これは一度だけ行う必要があり、何度も再利用できます。

  1. 次のdownload-cacheの例のように、ホイールからのインストールが許可され、ホイールハウスディレクトリがセットアップされ、find-linksおよびpip.confと重複するように、pip構成が適切に構成されている。

    [global]
    download-cache = /home/javl/.pip/cache
    find-links = /home/javl/.pip/packages
    
    [install]
    use-wheel = yes
    
    [wheel]
    wheel-dir = /home/javl/.pip/packages
    
  2. コンパイルする必要があるすべてのパッケージに必要なすべてのシステムライブラリをインストールする

  3. 必要なパッケージのホイールを作成します(numpy

    $ pip wheel numpy
    
  4. virtualenvをセットアップし(1回だけ必要)、それをアクティブにして、そこにインストールしますnumpy

    $ pip install numpy
    

    車輪の準備ができていると、迅速になります。

  5. scipyのホイールを作成します(virtualenvにあります)

    $ pip wheel scipy
    

    ここまでで、必要なホイールがホイールハウスに配置されます。

  6. 一時的なvirtualenvを削除できますが、それはもう必要ありません。

新しい仮想環境へのインストール

新しい仮想環境を作成し、アクティブにして、scipyをインストールしたいと思っています。

新しいscipyホイールからscipyを直接インストールすると、numpyがないために失敗します。これを解決するには、最初にnumpyをインストールします。

$ pip install numpy

そして、scipyで終わります

$ pip install scipy

私は推測しますが、これは1回の呼び出しで行うことができます(しかし、私はそれをテストしませんでした)

$ pip install numpy scipy

実績のあるバージョンのscipyを繰り返しインストールする

将来的には、scipyまたはnumpyの新しいリリースがリリースされ、pipはホイールハウスにホイールがない最新バージョンをインストールしようとする可能性があります。

これまでに使用したバージョンを使用できる場合は、numpyおよびscipyのバージョンを記載したrequirements.txtを作成し、そこからインストールする必要があります。

これにより、実際に使用される前に必要なパッケージが存在することが保証されます。

15
Jan Vlcinsky