【问题标题】:How to make easy_install execute custom commands in setup.py?如何让 easy_install 在 setup.py 中执行自定义命令?
【发布时间】:2010-11-29 14:54:46
【问题描述】:

我希望 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。

【问题讨论】:

    标签: python setuptools easy-install


    【解决方案1】:

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

    【讨论】:

    • 我知道我可以使用一些额外的东西,比如 Buildout,或者看起来 Paver,来做到这一点,但这不是我要问的。想象一下 PyPI 上的一个包,您只希望人们能够使用“easy_install package_name”进行安装。
    • 摊铺机可以这样使用,easy_install 和python setup.py install 仍将照常工作。事实上,如果设置正确,甚至不需要安装 Paver。见:packages.python.org/Paver/…
    【解决方案2】:

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

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

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

    【讨论】:

    • 不是我希望的答案,但我想可以给出最好的答案,所以我将其作为答案授予。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2013-01-04
    • 2015-05-10
    • 2022-11-27
    • 1970-01-01
    • 2016-03-11
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多