2009-11-18 87 views

回答

33

我通常使用的方法是重寫有問題的命令:

from distutils.command.install import install as DistutilsInstall 

class MyInstall(DistutilsInstall): 
    def run(self): 
     do_pre_install_stuff() 
     DistutilsInstall.run(self) 
     do_post_install_stuff() 

... 

setup(..., cmdclass={'install': MyInstall}, ...) 

這花我很長一段時間想從distutils文檔和源代碼中找出問題,所以我希望它能夠爲您節省很多痛苦。

注意:您也可以使用此cmdclass參數來添加新命令。

+1

感謝您的回答。爲我省下了痛苦?排序,我已經花了太多的時間尋找這個答案... – 2009-11-19 15:43:39

+6

看完這個答案後我已經實現了類似的東西,它工作得很好(https://github.com/Turbo87/py-xcsoar/blob /master/setup.py)。代碼運行一個Makefile,該Makefile創建兩個可執行文件,然後修改setup.py,然後將這些可執行文件安裝到系統中。同樣也可以安裝任何類型的庫。 – TBieniek 2013-11-13 18:03:54

+0

請注意,這似乎不能很好地使用pip,但是如果將'distutils.command.install'更改爲'setuptools.command.install',它可以從http://stackoverflow.com/questions/15853058/取得run-custom-task-when-call-pip-install – wxs 2016-10-24 18:56:31

1

如果你正在構建一個python擴展,你可以使用distutils/setuptools擴展。例如:

from setuptools import Extension 
# or: 
# from distutils.extension import Extension 
setup(... 
     ext_modules = [Extension("pkg.icu", 
           ["icu-sqlite/icu.c"]), 
        ] 
    ) 

有很多的選擇,以創建擴展,請參閱文檔:http://docs.python.org/distutils/setupscript.html

+0

這不是我想要構建的擴展,而只是一個不會與Python鏈接的C庫。 (這是對sqlite的擴展。) – 2009-11-18 20:33:10

0

可以使用distutils構建C庫(請參閱distutils.core.setup的libraries參數),但可能必須複製已存在於Makefile中的選項,因此最簡單的方法是擴展在其他回覆中解釋的安裝命令並調用子進程模塊。