2012-03-31 8 views
11

Gist:私たちがpip install packageによってトリガーされていることをsetup.pyで検出する最良の方法は何ですか?はsetup.pyのピップを検出します

背景: 私はパッケージ(Cライブラリ用のバインディング)を持っています。私はライブラリ自体を含む卵を提供しています。私のreadme/docsでは、このパッケージは特定のプラットフォームでは「easy_install-able」であることに注意してください。ソースからビルドするとき(例えばpipで)、ライブラリ自体はビルドの依存関係です。問題は、ピップがeasy_installの完全な置き換えであると間違って信じているユーザーを、私はやや定期的に混乱させており、ライブラリーなしで、あるいは実際に卵が欲しいコンパイラなしでシステム上で動作することを期待しているということです。

ビルドがpipによってトリガーされたことを検出したいので、ライブラリが不足しているために失敗したらフレンドリーな "pip!= easy_install"メッセージを提供できます。それは完璧である必要はありません、ちょうどpip install packageの最も一般的なケースをキャッチします。検査では、これを行うには、特に堅牢な方法があるように、それはいないようだ、と私は出ている最高のは、次のとおりです。

probably_using_pip = '--single-version-externally-managed' in sys.argv 

を検出するためのより良い(またはより良いまだ、正式な)方法はありますsetup.pyのpip?

+0

ライブラリが存在しないときに "setup.py install"を実行したときと異なるエラーメッセージが表示されるのはなぜですか? – joeforker

+0

'setup.py install'を実行すると、あなたは確かにソースからビルドしています。 'pip install'を実行すると、人々はバイナリを期待しているかも知れませんが、実際にはpipとeasy_installの違いを理解できません。この質問は、pip 1.5がデフォルトでホイールをサポートしているため、私の特定のケースにはもう関係しません。 – minrk

+0

さらにいくつかのコンテキスト:質問(2年前)の時点で、私のパッケージはコンパイラを持たないマシンにインストールされ、pipはバイナリフォーマットをサポートしませんでした。 easy_installは正常に動作しましたが、pipはコンパイルに失敗します。このため、 'pip install'が失敗した人に、easy_installが望ましいかもしれないことを知らせたいと思っていました。 – minrk

答えて

-1

おそらくpipを実行しようとするためにsubprocess/osを試してみてください。失敗した場合、pipがないことがわかります。

+0

しかし、そうでなければ何も意味しません。 –

+3

実際に使用されているかどうかを探しているので、pipが存在することは役に立たないことを知っています。さらに、pipの存在を簡単にチェックできるのは 'import pip'です。 – minrk

3

__file__セットアップでは、/tmp/pip-DNpsLw-build/setup.pyのようなものがpipから実行されます。

from setuptools import setup 

def determineInstaller(): 
    if 'pip' in __file__: 
     print('========pip triggered build========') #add smiley for friendliness :) 
    return 'dummy description' 

setup(name='bla', 
     version='0.0', 
     description=determineInstaller(), 
    ) 
+1

これはもう一つの良い点ですが、私は誤検出を減らすために具体的にしたいと思います。例: 'using_pip = os.path.basename(os.path.dirname(__ file __))。startswith( 'pip - ')'誰もが文書化された、あるいは公式であり、誤検出やプライベートAPIの変更に脆弱でない回答を提供していないことを考えると、ピップの作者はパッケージが使用中であることを伝えることはできないようです。 – minrk

+0

フレンドリーのために+1 – Cacovsky

+1

'__file__'ソリューションはPy 2.7 2014-10-27で動作していないようですが、' __file__'には 'pip'はありません。 'os.environ'には値 '/ run/shm/r/ven/bin/pip'を持つキー '_'があります。これは 'pip install -e 'を使ってインストールします。 -U'なので、おそらく '__file__'の解決策はより典型的なpipインストールで動作しますが、' _'キーがもっと一般的でしょうか? –

0

ピップがインストールできる建物wheelsと考えていますか?

+0

私は今、ホイールを作ります。私がこの質問をしたとき、車輪は存在しませんでした。 – minrk

関連する問題