Python Distutils-SIG: 擬議的使用者介面
Python Distutils-SIG
擬議的使用者介面
除了識別開發、分發和安裝 Python 模組涉及的常見任務和分工之外,"擴充套件構建之痛"開發者日會議還提出了一種擬議的使用者介面。該介面的核心思想是,模組開發者將提供一個小的 Python 指令碼,出於說明目的稱之為 setup.py
(儘管希望這種約定能夠流行起來!)。該指令碼將包含兩個組成部分:關於模組分發的元資料(名稱、版本號、描述等),以某種 Python 程式碼形式編寫;以及可選的程式碼,用於檢查目標系統並執行任何所需的預構建配置操作。只有元資料是必需的,事實上,預計大多數模組分發(特別是那些純粹用 Python 編寫的模組)將只有元資料部分。下面將介紹一些表示元資料的想法。
本文件描述了一個基於我們在開發者日會議上達成一致的介面,但有更多細節。(其中一些細節可以被解釋為實現而非介面,但將其在某處明確說明很重要。)
一旦 setup.py
指令碼編寫完成,開發者、打包者和安裝者都可以使用它來執行所有可以自動化的任務(即,除了實際編寫模組、文件和測試套件之外的所有事情)。這將透過執行 setup.py
並帶有一個強制性的“命令”引數來完成,該引數對應於要完成的任務。(巧合的是,其中許多命令將與傳統的 makefile
目標非常相似。)
例如,啟動構建的命令是 build
。開發者、打包者和安裝者(至少是使用源分發工作的安裝者)都必須使用以下命令構建模組
./setup.py build構建後,每個人都應該使用
test
命令執行測試套件./setup.py test當他對程式碼狀態滿意時,開發者會想戴上他的第一個打包者帽子並建立一個源分發
./setup.py dist或者他可能想戴上他的另一個打包者帽子並製作一個構建分發(或者這可以由其他平臺的打包者完成)
./setup.py bdist如果打包者正在為支援“智慧安裝程式”的系統製作構建分發(distutils 也支援!),他可以製作一個“智慧”構建分發,例如適用於使用它的 Linux 分發的 RPM
./setup.py bdist -rpm(請注意此處使用了特定於命令的選項;例如,
bdist
命令也應該有選項,以便為 Windows 和 Macintosh 生成“智慧”分發,前提是可以在這些平臺上找到合適的智慧安裝工具。)
現在,您可能想知道每個命令背後真正發生了什麼。有人可能會說這是一個實現細節,不屬於介面提案,但我認為大多數開發者、許多打包者以及少數好奇的使用者都傾向於“揭開面紗”看看在他們構建和安裝模組分發時究竟發生了什麼。(而那些不幸的人如果事情出了問題,就不得不瞭解這個過程!)因此,這裡列出了 setup.py
(透過與 distutils 模組合作)將支援的命令以及每個命令對應的操作
make_blib
- 如果不存在,則在當前目錄下建立模擬安裝目錄
blib/
。blib/
將包含純 Python 程式碼(非架構特定或共享)和編譯程式碼(架構特定)的目錄,其結構模仿當前機器上系統 Python 庫中的目錄(這些目錄在 Python 本身構建時確定)。例如,make_blib
可能會建立blib/share/
(共享檔案)和blib/plat-i86-linux/
(架構特定檔案)。可能還有文件目錄,例如用於 Unix 風格手冊頁的blib/man/
,用於 GNU info 文件的blib/info/
,和/或用於(你猜對了)HTML 文件的blib/html/
。 build_py
- 執行
make_blib
;將.py
檔案複製到“共享”blib
目錄(如果它們屬於包,則複製到其子目錄),並將其編譯為.pyc
和.pyo
形式。 build_extensions
- 執行
make_blib
;編譯輔助 C 檔案(那些不提供擴充套件模組本身,但為了正在構建的擴充套件能工作而必需的);編譯擴充套件 C 檔案;連結輔助和擴充套件 C 檔案(以及任何所需的外部庫)以在特定於架構的blib
目錄中建立動態庫(例如 Unix 的.so
檔案,Windows 的 DLL 等) build_doc
- 將文件處理成可安裝的形式,放到
./blib
下的某個位置,例如 *roff 格式的手冊頁、GNU Info、HTML、Windows 幫助等。也許所需的文件格式可以在 Python 本身構建時確定(當然,Python 文件將以該格式提供,與模組文件累積的位置相同)? build
- 執行
build_py
、build_extensions
和build_doc
。(當然,如果不存在相應的輸入,這些操作中的任何一個都不會執行任何操作。) dist
- 建立源分發...
bdist
- 建立構建分發...
test
- 查詢測試套件並執行它。定義測試套件的一種可能方法:在源分發的預定義子目錄中放置一堆指令碼;然後將這些指令碼與新增到 Python 庫搜尋路徑中的共享和特定於架構的
blib
目錄一起執行。例如,test
命令可能會搜尋test/*.t
,依次執行每個指令碼並解釋其輸出以確定該系列測試是成功還是失敗。 install
- 將
.py
、.pyc
和.pyo
檔案複製到共享安裝目錄(預設是 Python 系統庫樹中特定於站點區域);將動態庫(共享物件或 DLL)複製到特定於架構的安裝目錄;將處理後的文件(手冊頁、Info 檔案等)複製到文件安裝目錄。(也許這應該拆分為install_py
、install_extensions
和install_doc
?)