2010-04-25 51 views
3

我正在尋找一種方法,包括在安裝階段蟒(擴展)模塊的一些功能。setup.py添加選項(又名setup.py的--enable-功能)

在實際的方式:

我有具有相同功能的2個實施方式中,一個內部(緩動)和一個依賴從外部庫(快,在C)一個python庫。

我想,這個庫是可選的,可以在編譯被激活使用標誌像/安裝時間:

python setup.py install # (it doesn't include the fast library) 
python setup.py --enable-fast install 

我不得不使用Distutils的,但是所有的解決方案都好接受!

+0

非常感謝您的回答,他們每個人值得接受的答案! – pygabriel 2010-04-26 09:33:37

回答

2

你想要的一個例子是sqlalchemycextensions,它們專門用於相同的目的 - 更快的C實現。爲了看到SA如何實現它,你需要看2個文件:

1)setup.py。正如你可以從下面的提取物看,他們處理的案件有setuptoolsdistutils

try: 
    from setuptools import setup, Extension, Feature 
except ImportError: 
    from distutils.core import setup, Extension 
    Feature = None 

後來有一個檢查if Feature:並且擴展使用可變extra,這是後來加入的每一種情況下正確配置setup()函數。

2)base.py:這裏看看BaseRowProxy是如何定義的:

try: 
    from sqlalchemy.cresultproxy import BaseRowProxy 
except ImportError: 
    class BaseRowProxy(object): 
     #.... 

所以基本上,一旦C擴展安裝(使用安裝過程中--with-cextensions標誌),C實現將被使用。否則,使用類/函數的純Python實現。

4

的的distutils的文檔包括a section on extending the standard functionality。相關建議似乎是從distutils.command.*模塊(例如build_pyinstall)中繼承相關類的子類,並告知setup使用新版本(通過cmdclass參數,該參數是一個字典映射命令,用於將要用於類的字典)執行它們)。看到任何命令類的源(例如the install command)得到一個什麼樣一個人做的,添加一個新的選項是一個好主意。