多くの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
というパッケージをインストールしたいと考えています:
- 私は
foo
というパッケージをインストールしたいと思います。 pip install foo
foo
Pythonパッケージbar
に依存しています。bar
ビルドに失敗した場合は、エラーメッセージを見て、私がインストールする必要のあるPython以外の依存関係を推測してください。sudo apt-get install libbaz-dev
sudo pip install bar
- 繰り返し
bar
が成功するまで。
sudo pip uninstall foo
- エラーメッセージなしまでプロセス全体を繰り返します。
ステップ4は特に迷惑です。明らかにpip
(バージョン1.5.4)は、依頼されたパッケージを最初にの依存関係の前にインストールします。したがって、依存関係が失敗した場合は、すでにインストールされていると考えられるため、pip
に再度インストールを依頼することはできません。依存関係だけをインストールするオプションもないので、パッケージをアンインストールしてから再インストールする必要があります。
pip
を使用するためのさらにインテリジェントなプロセスがありますか。
これは価値があるので、科学界にとって非常に多くのPythonパッケージマネージャが存在する理由です。 (例えば、「pythonディストリビューション」のパッケージマネージャーは 'conda'や' enpkg'や 'bento'のようなsetuptoolsの置き換え、あまり知られていないものなど)WindowsやOSXでは、パッケージメンテナーは、バイナリホイールに必要なすべてのライブラリがありますが、linux/BSDシステムでは、システムPythonがどのコンパイラで構築されたかを保証することは難しいです。とにかく、私が知る限り、distutilsのメタデータに外部依存関係を指定する方法はありません。 –
私はこの問題の一部は、オペレーティングシステムとダイナミックリンカの動作にも固有のものだと考えています。理想的には、OSなどの共有ライブラリを利用して、メモリなどの効率を高めることができます。ただし、同じリリースサイクルの他のすべてのパッケージは一定の合意されたバージョンに依存するため、システムパッケージマネージャでのみ共有ライブラリをインストールできます。このため、pipにはリリースサイクルの概念がないため、実際にはpipとaptの間に信頼性の高いインターフェースはありません。 –
DebianはDebianに関連するものをすべて避ける理由のひとつです。 Debianで「何かをすばやくコンパイルする」ということはありません。なぜなら、あなたは常に '-dev'パッケージを探しているからです。この問題は 'pip'に限定されません。 – Carpetsmoker