2009-09-18 66 views
7

我希望我的setup.py做一些自定義操作,除了剛剛安裝Python包(如安裝一個腳本init.d中,創建目錄和文件等),我知道我可以自定義的distutils/setuptools的班做我自己動作。我遇到的問題是,當我cd到軟件包目錄並執行「python setup.py install」時,一切正常,但當我執行「easy_install mypackage.tar.gz」時,我的自定義類似乎不會被執行。這是我的setup.py文件(創建在同一目錄空myfoobar.py文件來測試):如何使easy_install在setup.py中執行自定義命令?

import setuptools 
from setuptools.command import install as _install 

class install(_install.install): 
    def initialize_options(self): 
     _install.install.initialize_options(self) 

    def finalize_options(self): 
     _install.install.finalize_options(self) 

    def run(self): 
     # Why is this never executed when tarball installed with easy_install? 
     # It does work with: python setup.py install 
     import pdb;pdb.set_trace() 
     _install.install.run(self) 

setuptools.setup(
    name = 'myfoobar', 
    version = '0.1', 
    platforms = ['any'], 
    description = 'Test package', 
    author = 'Someone', 
    py_modules = ['myfoobar'], 
    cmdclass = {'install': install}, 
) 

同樣的事情發生,即使我輸入「設置」,並從distutils的「安裝」。任何想法我可以讓easy_install執行我的自定義類?

爲了澄清,我不希望使用任何額外的費用,如擴建或攤鋪機。

回答

4

不能這樣做。 Enthought有一個setuptools的定製版本,它支持這個功能,但是它在bug追蹤器中是一個自6月份以來一直在討論的心願單項目。

然而,也有辦法來欺騙系統,你可能會考慮他們。一種方法是擁有最重要的模塊,即使用包時始終先導入的模塊,並在第一次調用時執行安裝後操作。然後你必須自己清理一下,並考慮你無法寫入庫的情況,因爲管理員安裝了該軟件包,並且第一個用戶不是管理員。

在最壞的情況下,這將涉及創建永遠用戶〜/ .mypackage目錄誰使用的軟件包,併爲每個新用戶一旦重新運行安裝後。每次模塊被導入時,它都會檢查〜/ .mypackage的存在。如果它不存在,它將運行postinstall並創建它。如果它在那裏,它會跳過安裝後。

+0

不是我希望的答案,但我想最好的,可以給,所以我把它作爲答案。謝謝! – 2009-10-26 17:41:07

5

Paver需要setuptools的到一個新的水平,讓你編寫自定義任務。它允許你擴展典型的setup.py文件,並提供一個簡單的方式來引導Paver環境。

+0

我知道我可以使用額外的東西,比如擴建,或似乎攤鋪機,要做到這一點,但是這不是我問。想象一下PyPI上的軟件包,您只希望人們可以使用「easy_install package_name」進行安裝。 – 2009-09-18 22:03:41

+3

攤鋪機可以用easy_install和'python setup.py install'這樣的方式照常使用。事實上,如果安裝正確,攤鋪機甚至不需要安裝。請參閱:http://packages.python.org/Paver/getting_started.html#but-people-are-used-to-setup-py – 2011-03-14 00:56:47