2009-09-18 25 views
7

Je veux que mon setup.py fasse des actions personnalisées en plus d'installer le paquet Python (comme installer un script init.d, créer des répertoires et des fichiers, etc.) Je sais que je peux personnaliser les classes distutils/setuptools pour faire les miennes actes. Le problème que j'ai est que tout fonctionne quand je cd dans le répertoire du paquet et que je fais "python setup.py install", mais mes classes personnalisées ne semblent pas être exécutées quand je fais "easy_install mypackage.tar.gz". Voici mon fichier setup.py (créer un fichier myfoobar.py vide dans le même répertoire pour tester):Comment faire pour que easy_install exécute des commandes personnalisées dans setup.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}, 
) 

La même chose se produit même si j'importer « setup » et « install » de distutils. Des idées comment je pourrais faire easy_install exécuter mes classes personnalisées?

Pour clarifier, je ne veux pas utiliser quelque chose de plus, comme Buildout ou Paver.

Répondre

4

Cela ne peut pas être fait. Enthought a une version personnalisée de setuptools qui supporte cela, mais sinon il est dans le bug tracker comme un élément de liste de souhaits qui a été en discussion depuis Juin.

Cependant, il existe des moyens de tromper le système et vous pourriez les prendre en compte. Une façon est d'avoir votre module le plus important, celui qui est toujours importé en premier lorsque vous utilisez votre paquet, faites les actions de post-installation la première fois qu'il est appelé. Ensuite, vous devez nettoyer après vous, et considérez le cas où vous ne pouvez pas écrire dans la bibliothèque parce qu'un administrateur a installé le paquet et le premier utilisateur est quelqu'un d'autre que l'administrateur. Dans le pire des cas, cela impliquerait de créer un répertoire ~/.mypackage pour tout utilisateur qui utilise le paquet, et de réexécuter la post-installation une fois pour chaque nouvel utilisateur. Chaque fois que le module est importé, il vérifie l'existence de ~/.mypackage. Si ce n'est pas le cas, il lance le postinstall et le crée. Si c'est le cas, il ignore le postinstall.

+0

Pas la réponse que j'espérais, mais je suppose que le meilleur qui puisse être donné, donc je l'attribue comme réponse. Merci! –

5

Paver prend setuptools au niveau suivant et vous permet d'écrire des tâches personnalisées. Il vous permet d'étendre le fichier setup.py typique et fournit un moyen simple d'amorcer l'environnement Paver.

+0

Je sais que je pourrais utiliser quelque chose de plus, comme Buildout ou Paver, mais ce n'est pas ce que je demande. Imaginez un paquet sur PyPI que vous voulez juste que les gens puissent installer avec "easy_install package_name". –

+3

Paver peut être utilisé de telle sorte que easy_install et 'python setup.py install' fonctionneront comme d'habitude. En fait, Paver n'a même pas besoin d'être installé s'il est configuré correctement. Voir: http://packages.python.org/Paver/getting_started.html#but-people-are-used-to-setup-py –