7

除了安装 Python 包(如安装 init.d 脚本、创建目录和文件等)之外,我还希望 setup.py 执行一些自定义操作。我知道我可以自定义 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 导入“设置”和“安装”,也会发生同样的事情。有什么想法可以让 easy_install 执行我的自定义类吗?

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

4

2 回答 2

5

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

于 2009-09-18T21:32:05.340 回答
4

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

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

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

于 2009-10-25T17:49:42.837 回答