如何让easy_install在setup.py中执行自定义命令?

时间:2009-09-18 20:30:02

标签: python setuptools easy-install

我希望我的setup.py除了安装Python软件包之外还做一些自定义操作(比如安装init.d脚本,创建目录和文件等)我知道我可以自定义distutils / setuptools类来做我的自己的行动。我遇到的问题是当我cd到包目录并执行“python setup.py install”时一切正常,但是当我执行“easy_install mypackage.tar.gz”时,我的自定义类似乎没有被执行。这是我的setup.py文件(在同一目录中创建一个空的myfoobar.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导入“setup”和“install”,也会发生同样的事情。任何想法如何让easy_install执行我的自定义类?

为了澄清,我不想使用任何额外的东西,比如Buildout或Paver。

2 个答案:

答案 0 :(得分:5)

Paver使setuptools更上一层楼,让您编写自定义任务。它允许您扩展典型的setup.py文件,并提供一种引导Paver环境的简单方法。

答案 1 :(得分:4)

无法做到。 Enthought有一个自定义版本的setuptools支持这个,但是它在bug跟踪器中作为一个愿望清单项目,自6月以来一直在讨论。

然而,有一些方法可以欺骗系统,你可能会考虑它们。一种方法是使用最重要的模块,即在使用软件包时始终首先导入的模块,在第一次调用时执行安装后操作。然后你必须自己清理,并考虑你不能写入库的情况,因为管理员安装了包,第一个用户是管理员以外的人。

在最坏的情况下,这将涉及为使用该软件包的任何用户创建一个〜/ .mypackage目录,并为每个新用户重新运行一次postinstall。每次导入模块时,它都会检查是否存在〜/ .mypackage。如果不存在,则运行postinstall并创建它。如果它在那里,它会跳过安装后的。