2017-01-11 10 views
1

私はdistutilsの使い方を学んでいます。私は理解できないことがあります。Python 3:setup.py:pip install(build_ext + install)

私はすでに私がpython3 setup.py sdistを使用して呼び出す機能setuptools.setup()を実行します簡単なスクリプトで、setup.pyでこれをやった

pip install mypackage.tar.gz 

でインストールすることができtar.gz形式のパッケージを作成することに成功しています。

私が今学んでいるもの:これにビルディングエクステンションを含める方法。

私の問題:私はbuild_extクラスを持つパッケージのpip installは、それがインストールし、構築するために得ることができる方法を説明任意の包括的なテキストを見つけることができませんでした。

我々はthis exampleを見れば、有名なツールcx_freezeパッケージのために、我々は以下を参照してください

  • 継承build_extクラス
  • があります方法build_extension()
  • が含まれている変数cmdclassは、setup()にありますクラスを含む辞書build_ext

私の質問:cx_freezeが拡張機能をビルドしてインストールするのは何ですか?これを達成するのに十分なbuild_extcmdclassを定義していますか?

答えて

1

多くのテストの後で、これはpipがどのように動作するかに関係していることを知りましたが、setup.pyの仕組みではありません。

  1. ピップは、それが/tmpでのLinuxには、一時ファイルを作成し、Windows上で、それはユーザーの一時ディレクトリにあります:それはあなたのsetup.pyファイルの書き込みをしてインストールするpipを使用した後、これは何が起こるかであることが判明しました。
    • setup.py install
    • PIPダウンロード/ PIPが順に次の操作を実行
    • (tar.gz形式から、またはオンラインソースから、またはリポジトリからかどうか)、その一時ディレクトリにパッケージを抽出しますsetup.py build
    • setup.py install_lib
    • setup.py build_py
    • setup.py build_ext

そして、すべてこれはあなたがsetup()cmdclassパラメータで定義されたものを持っているかどうかによって異なります。たとえば、build_extは、build_extcmdclassで定義され、がsetup()コールのパラメータで定義されている場合にのみ実行されます。たとえば、ext_modulesは、すべての拡張に関するすべての情報を含むExtension()のリストになると予想されます。クラスbuild_extension(self,ext)の関数は、そのリストのすべての要素に対して実行されます。 cmdclassに行く

すべてのこれらのクラスは、カスタム構築手順に置くためにオーバーライドする必要がありrun()というメソッドを持っている(私はbuildbuild_pyを使用します)。

すべてのことが行われた後、ピップ(またはコピー)をインストールします(基本的にはその温度でのディレクトリです)setup()で定義されたpackagesインストールの最後で、一時ファイルを削除し、あなたのPythonディレクトリには。

これ以上の詳細はありますが、これは初心者には良いことだと思います。これのどれも包括的にどこにも説明されていなかった。だから私はこれが助けられ、これを学ぶために私がしなければならなかった経験的なテストを人々に救うことを願っています。