簡體   English   中英

使用distutils / setuptools配置擴展模塊

[英]Configuring extension modules with distutils/setuptools

我有一個Python項目,其中包含用C編寫的多個擴展模塊,它們與第三方庫進行通信。 但是,根據用戶的環境和選項,不應構建某些模塊,並且應啟用/禁用某些編譯器標志。 問題是我必須在調用setup()之前構建擴展模塊列表,理想情況下我想使用distutils.Command子類來處理用戶選項。 現在我有幾個選擇:

  1. 在構建模塊之前需要運行“python setup.py configure”命令,將信息存儲在pickle文件中,並在下次運行腳本時使用它來生成擴展列表。 這就是我的項目目前的工作方式,這看起來很愚蠢。

  2. 手動從sys.argv中刪除選項並使用它們來構建列表。 這不是一個長期的解決方案,因為我最終會想要在構建之前運行一些腳本來檢查設置。

  3. 來自distutils的子類build_ext,在run()方法的開頭做我的配置(可能還使用通過(2)發送的選項)並在構建之前直接修改self.distribution.ext_modules。 但是,我擔心這可能會混淆setuptools,因為它可能會在調用setup()時修復擴展模塊列表。 這也意味着當使用除build_ext之外的命令調用setup()時,擴展模塊列表為空。

有沒有一種首選的方法呢?

有沒有一種首選的方法呢?

根據我與其他人的模塊合作的經驗,我可以說在正確的方法上肯定沒有達成共識。

我已經嘗試並拒絕了子類的distutils - 我發現它很脆弱,難以在不同的Python版本和不同的系統中工作。

對於我們的代碼,嘗試類型的你正在考慮的事情后,我已經在主調用前做檢測和配置權setup.py入駐setup() 這無疑是有點難看,但這意味着有人嘗試編譯你的東西有一個地方可以弄清楚為什么包含路徑是錯誤的。 (他們當然不需要成為distutils內部的專家)。

我自己改變distutils的經驗一直很弱而且不穩定,所以我能提供的只是指針。 看看numpy。 這有一個完整的子模塊(numpy.distutils),有方法可以處理(或解決)distutils。 否則,請詢問distutils郵件列表。

我會將distutils.core.Distribution子類化並使用distutils.core.setup(distclass=CustomDistribution)傳遞它 - 這使您可以像正常設置一樣訪問命令行參數,並且可以執行類似的操作調整CustomDistribution.__init__方法中的擴展名列表。 但我同意達爾克的說法,因為苦惱的方式充滿痛苦......

config命令設計為子類,並由具有類似要求的項目使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM