2009-09-18 55 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

相关问题