如何将安装后脚本添加到 easy_install / setuptools / distutils?

Posted

技术标签:

【中文标题】如何将安装后脚本添加到 easy_install / setuptools / distutils?【英文标题】:How can I add post-install scripts to easy_install / setuptools / distutils? 【发布时间】:2010-09-19 23:40:02 【问题描述】:

我希望能够在我的 setup.py 中添加一个挂钩,该挂钩将在安装后运行(在 easy_install'ing 或 python setup.py 安装时)。

在我的项目PySmell 中,我有一些 Vim 和 Emacs 的支持文件。当用户以通常的方式安装 PySmell 时,这些文件会被复制到实际的 egg 中,用户必须将它们取出并将它们放在他的 .vim 或 .emacs 目录中。我想要的是在安装后询问用户,他希望将这些文件复制到哪里,或者甚至只是一条消息,打印文件的位置以及他应该如何处理它们。

最好的方法是什么?

谢谢

我的 setup.py 看起来像这样:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from setuptools import setup

version = __import__('pysmell.pysmell').pysmell.__version__

setup(
    name='pysmell',
    version = version,
    description = 'An autocompletion library for Python',
    author = 'Orestis Markou',
    author_email = 'orestis@orestis.gr',
    packages = ['pysmell'],
    entry_points = 
        'console_scripts': [ 'pysmell = pysmell.pysmell:main' ]
    ,
    data_files = [
        ('vim', ['pysmell.vim']),
        ('emacs', ['pysmell.el']),
    ],
    include_package_data = True,
    keywords = 'vim autocomplete',
    url = 'http://code.google.com/p/pysmell',
    long_description =
"""\
PySmell is a python IDE completion helper. 

It tries to statically analyze Python source code, without executing it,
and generates information about a project's structure that IDE tools can
use.

The first target is Vim, because that's what I'm using and because its
completion mechanism is very straightforward, but it's not limited to it.
""",
    classifiers = [
        'Development Status :: 5 - Production/Stable',
        'Environment :: Console',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: BSD License',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Topic :: Software Development',
        'Topic :: Utilities',
        'Topic :: Text Editors',
    ]


)

编辑:

这是一个演示 python setup.py install 的存根:

from setuptools.command.install import install as _install

class install(_install):
    def run(self):
        _install.run(self)
        print post_install_message

setup(
    cmdclass='install': install,
    ...

easy_install 路线还没有运气。

【问题讨论】:

我刚刚发现显式调用 setuptools.install.install:run() 并不能解析 install_requires 设置参数,而且当你这样做时,它似乎以不同的方式工作 @astronaut 使用 do_egg_install,如下所述:***.com/questions/21915469/… 【参考方案1】:

这取决于用户如何安装您的软件包。如果用户实际运行“setup.py install”,这相当简单:只需在安装命令中添加另一个子命令(例如 install_vim),它的 run() 方法会将您想要的文件复制到您想要的位置。您可以将子命令添加到 install.sub_commands,然后将命令传递给 setup()。

如果您想要二进制文件中的安装后脚本,这取决于您创建的二进制文件的类型。例如,bdist_rpm、bdist_wininst 和 bdist_msi 支持安装后脚本,因为底层打包格式支持安装后脚本。

bdist_egg 在设计上不支持安装后机制:

http://bugs.python.org/setuptools/issue41

【讨论】:

"只需在安装命令中添加另一个子命令(比如 install_vim)" 那是怎么做的呢? 答案请看上面问题的下半部分。 (@limp-chimp,@maverick-wolverine)【参考方案2】:

作为一种变通方法,您可以将 zip_ok 选项设置为 false,以便您的项目安装为解压缩目录,这样您的用户将更容易找到编辑器配置文件。

在 distutils2 中,可以将东西安装到更多目录,包括自定义目录,并具有 pre/post-install/remove 挂钩。

【讨论】:

以上是关于如何将安装后脚本添加到 easy_install / setuptools / distutils?的主要内容,如果未能解决你的问题,请参考以下文章

如何将python模块放置到pypi库,如何编写python模块的安装文件使得其他开发者直接easy_install即可?

如何在 Windows 上使用 Python 的“easy_install”……没那么容易

将 easy_install 与 sklearn-pandas 一起使用

win10安装python 环境变量设置无效求助T

linux下easy_install的安装与使用详解

为啥easy_install会提取一些python鸡蛋而不是其他的?