2017-01-11 959 views
1

我正在學習如何使用distutils,有些事我不明白,我希望有人能向我解釋這一點。Python 3:setup.py:完成所有工作(build_ext + install)的pip安裝

我已經很成功地創造能與

pip install mypackage.tar.gz 

我這樣做是與setup.py安裝的tar.gz包,與運行功能setuptools.setup(),我稱之爲使用python3 setup.py sdist一個簡單的腳本。

我現在想學的東西:如何在此包含建築物擴展。

我的問題:我找不到解釋具有build_ext類可以得到它構建一個軟件包的pip install如何,然後再安裝任何全面的文本。

如果我們看一下this example,爲著名的工具cx_freeze包裝,我們可以看到:

  • 有一個繼承build_ext
  • 有一個方法build_extension()
  • setup(),該變量cmdclass,其中包含包含類的詞典build_ext

我的問題:什麼cx_freeze構建擴展,然後安裝它?定義爲build_extcmdclass是否足以實現此目的?

回答

1

經過多次測試後,我瞭解到這與pip的工作方式有關,而不是setup.py的工作方式。事實證明,寫你的setup.py文件並使用pip安裝後,這是發生了什麼:

  1. PIP創建一個臨時文件,在Linux下它在/tmp,而在Windows它在用戶的臨時目錄。
  2. PIP下載/提取包到該臨時目錄
  3. PIP(無論是從一個tar.gz或從在線源或從存儲庫)運行以下操作,以便:
    • setup.py install
    • setup.py build
    • setup.py install_lib
    • setup.py build_py
    • setup.py build_ext

而這一切都取決於你是否有在setup()cmdclass參數定義的東西。例如,build_ext只有在cmdclass中定義了build_ext並且在setup()呼叫的參數中定義了ext_modules時纔會運行。例如,ext_modules預計爲Extension()的列表,其中包含有關每個擴展的所有信息。類build_extension(self,ext)中的函數將在該列表的每個元素上執行。

所有這些類是去cmdclass(我用buildbuild_py)有一個名爲run()方法,你應該重寫就擺在您的自定義建設過程。

畢竟做到這一點,PIP 安裝(或複印件)在setup()定義的packages(基本上在臨時目錄)到你的Python目錄,這是安裝結束,並刪除臨時文件。

還有更多的細節,所有這一切,但我想這對一個初學者很好。我沒有看到這一點在全面解釋。所以我希望這有助於並節省人們進行實證測試,以便我學會這一點。