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

Hei*_*nen 7 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},
)
Run Code Online (Sandbox Code Playgroud)

即使我从distutils导入"setup"和"install",也会发生同样的事情.任何想法如何让easy_install执行我的自定义类?

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

Joh*_*ett 5

Paver将setuptools提升到了一个新的水平,让您编写自定义任务.它允许您扩展典型的setup.py文件,并提供一种引导Paver环境的简单方法.

  • paver可以这样使用easy_install和`python setup.py install`仍然可以正常工作.实际上,如果设置正确,甚至不需要安装Paver.请参阅:http://packages.python.org/Paver/getting_started.html#but-people-are-used-to-setup-py (3认同)

Mic*_*lon 4

这是不可能的。Enthought 有一个自定义版本的 setuptools 确实支持这一点,但除此之外,它作为愿望清单项目出现在错误跟踪器中,自 6 月份以来一直在讨论。

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

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