2015-01-01 9 views
22

多くのPythonパッケージは、非Pythonパッケージに依存するビルドを持っています。私は特にlxmlとcffiを考えていますが、このジレンマはPyPIの多くのパッケージに当てはまります。これらのパッケージはどちらも、libxml2-dev、libxslt-dev、zlib1g-dev、libffi-devのような非Pythonパッケージに対する依存しないビルド依存関係を持っています。 lxmlとcffiのウェブサイトはこれらの依存関係のいくつかを宣言していますが、コマンドラインからこれを把握する方法はないようです。Pythonに依存しないパッケージを `pip install 'するには?

その結果、この一般的な形をとるので、上の質問の何百もある:

pip install foo fails with an error: "fatal error: bar.h: No such file or directory". How do I fix it?

これはpipの誤用ですか、動作するように意図された方法をこののですか?pipを実行する前に、依存関係を構築するためにどのような依存関係を構築するのか分かりませんか?私の現在のアプローチは、fooというパッケージをインストールしたいと考えています:

  1. 私はfooというパッケージをインストールしたいと思います。
  2. pip install foo
  3. foo Pythonパッケージbarに依存しています。
    • barビルドに失敗した場合は、エラーメッセージを見て、私がインストールする必要のあるPython以外の依存関係を推測してください。
    • sudo apt-get install libbaz-dev
    • sudo pip install bar
    • 繰り返しbarが成功するまで。
  4. sudo pip uninstall foo
  5. エラーメッセージなしまでプロセス全体を繰り返します。

ステップ4は特に迷惑です。明らかにpip(バージョン1.5.4)は、依頼されたパッケージを最初にの依存関係の前にインストールします。したがって、依存関係が失敗した場合は、すでにインストールされていると考えられるため、pipに再度インストールを依頼することはできません。依存関係だけをインストールするオプションもないので、パッケージをアンインストールしてから再インストールする必要があります。

pipを使用するためのさらにインテリジェントなプロセスがありますか。

+1

これは価値があるので、科学界にとって非常に多くのPythonパッケージマネージャが存在する理由です。 (例えば、「pythonディストリビューション」のパッケージマネージャーは 'conda'や' enpkg'や 'bento'のようなsetuptoolsの置き換え、あまり知られていないものなど)WindowsやOSXでは、パッケージメンテナーは、バイナリホイールに必要なすべてのライブラリがありますが、linux/BSDシステムでは、システムPythonがどのコンパイラで構築されたかを保証することは難しいです。とにかく、私が知る限り、distutilsのメタデータに外部依存関係を指定する方法はありません。 –

+2

私はこの問題の一部は、オペレーティングシステムとダイナミックリンカの動作にも固有のものだと考えています。理想的には、OSなどの共有ライブラリを利用して、メモリなどの効率を高めることができます。ただし、同じリリースサイクルの他のすべてのパッケージは一定の合意されたバージョンに依存するため、システムパッケージマネージャでのみ共有ライブラリをインストールできます。このため、pipにはリリースサイクルの概念がないため、実際にはpipとaptの間に信頼性の高いインターフェースはありません。 –

+0

DebianはDebianに関連するものをすべて避ける理由のひとつです。 Debianで「何かをすばやくコンパイルする」ということはありません。なぜなら、あなたは常に '-dev'パッケージを探しているからです。この問題は 'pip'に限定されません。 – Carpetsmoker

答えて

11

を使用することができます。と対話しようとvirtualenvのあなたにPythonパッケージは、システム全体のインストールおよびPythonパッケージをインストールしたとき、あなたは神秘的なエラーを得ることができるよう、苦痛になることができ、その後apt-get経由のpython-のパッケージをインストールし、多くのことをvirtualenv使用する場合

お互い。私が助けになることがわかったことの1つは、build-dep機能を使用することです。例えば、matplotlibの依存関係を構築するには、次の

sudo apt-get build-dep python-matplotlib 

そして、あなたの仮想環境をアクティブにしpip install matplotlibを行います。それでもビルドプロセスは終了しますが、多くの依存関係があなたのために処理されます。

これは、ubuntuでRパッケージをインストールするときに、cran repositoriesが示唆しているものを並べ替えます。

+1

私はこれをスタンドアローンの回答に再加工する必要があると思います。 –

+0

トラヴィスと同意。これは私が決して考えなかった巧妙な答えです。 –

1

最も人気のあるパッケージでは、最近のubuntuシステムの回避策があります。たとえば、matplotlibをインストールしたいとします。 pip install matplotlibを注文すると、通常、依存関係がないために失敗します。

代わりにapt-get install python-matplotlibを使用できます。 python3のために、あなたはこれが実際にapt-getを使用して示唆答えについてのコメントですが、私は1つを残して十分評判ポイントを持っていないapt-get install python3-matplotlib

+1

パッケージを仮想環境にインストールするにはどうすればよいですか? – alecxe

+0

@alecxeわかりません。とにかく私の提案を仮想環境に使用することはありません。 –

+2

このアプローチには2つの問題があります:(1)ほとんどのubuntuパッケージはPyPIのそれよりかなり遅れています、(2) 'pip'はあなたのAPTパッケージについて何も知らないので、' apt-get install python- matplotlib'に依存するものを 'pip install'しようとすると、' pip'は 'matplotlib'を再度インストールしようとします。私はすべてのAPTまたはすべての 'pip'を使う方が良いと思います。両者を組み合わせることは、将来の混乱と不満を招くだけです。 –

関連する問題