2008-10-30 5 views
32

Je voudrais être en mesure d'ajouter un hook à mon fichier setup.py qui sera exécuté après l'installation (soit lors de l'installation facile, soit lors de l'installation de python setup.py).Comment puis-je ajouter des scripts post-installation à easy_install/setuptools/distutils?

Dans mon projet, PySmell, j'ai quelques fichiers de support pour Vim et Emacs. Lorsqu'un utilisateur installe PySmell de la manière habituelle, ces fichiers sont copiés dans l'œuf réel, et l'utilisateur doit les extraire et les placer dans ses répertoires .vim ou .emacs. Ce que je veux, c'est soit demander à l'utilisateur, après l'installation, où il aimerait que ces fichiers soient copiés, ou même juste un message imprimant l'emplacement des fichiers et que devrait-il faire avec eux.

Quelle est la meilleure façon de faire cela?

Merci

Mon setup.py ressemble à ceci:

#!/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 = '[email protected]', 
    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', 
    ] 


) 

EDIT:

est ici un talon qui démontre la 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}, 
    ... 

Pas de chance avec le easy_install route encore.

+2

Je viens d'apprendre que l'appel 'setuptools.install.install: run()' ne résout pas explicitement l'argument d'installation 'install_requires' et il semble que cela fonctionne différemment quand vous faites cela. – astronaut

+1

@astronaut use 'do_egg_install', comme discuté ici: http://stackoverflow.com/questions/21915469/python-setuptools-install-requires-is-ignored-when-overriding-cmdclass –

Répondre

7

Cela dépend de la façon dont l'utilisateur installe votre paquet. Si l'utilisateur exécute "setup.py install", c'est assez simple: ajoutez simplement une autre sous-commande à la commande install (disons, install_vim), dont la méthode run() va copier les fichiers que vous voulez dans les endroits où vous les voulez. Vous pouvez ajouter votre sous-commande à install.sub_commands et passer la commande dans setup().

Si vous voulez un script de post-installation dans un binaire, cela dépend du type de binaire que vous créez. Par exemple, bdist_rpm, bdist_wininst et bdist_msi prennent en charge les scripts de post-installation, car les formats d'empaquetage sous-jacents prennent en charge les scripts post-installation.

bdist_egg ne supporte pas un mécanisme post-installation par la conception:

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

+2

" Il suffit d'ajouter une autre sous-commande à la commande d'installation (disons, install_vim) "Et comment fait-on cela? –

+0

Toute mise à jour à ce sujet? – MavWolverine

+2

Pour la réponse, ** regardez la partie inférieure de la _question_ ci-dessus **. (@ limp-chimp, @ maverick-carcajou) –

0

En tant que travail autour, vous pouvez définir l'option zip_ok false afin que votre projet est installé comme un répertoire décompressé , alors il sera un peu plus facile pour vos utilisateurs de trouver le fichier de configuration de l'éditeur.

Dans distutils2, il sera possible d'installer des éléments dans plusieurs répertoires, y compris des répertoires personnalisés, et d'avoir des hooks pré/post-install/remove.

Questions connexes