2008-10-30 12 views
32

Ich möchte in der Lage sein, einen Haken zu meiner setup.py hinzufügen, die nach der Installation ausgeführt werden (entweder wenn easy_install'ing oder wenn Python setup.py installieren).Wie kann ich Nachinstallations-Skripte zu easy_install/setuptools/distutils hinzufügen?

In meinem Projekt, PySmell, habe ich einige Support-Dateien für Vim und Emacs. Wenn ein Benutzer PySmell auf die übliche Weise installiert, werden diese Dateien in das eigentliche Ei kopiert und der Benutzer muss sie herausfischen und in seine .vim- oder .emacs-Verzeichnisse stellen. Ich möchte den Benutzer fragen, nach der Installation, wohin diese Dateien kopiert werden sollen, oder einfach nur eine Nachricht, die den Speicherort der Dateien ausgibt und was er damit machen soll.

Was ist der beste Weg, dies zu tun?

Dank

Mein setup.py sieht so aus:

#!/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:

hier ein Stub ist, die die python setup.py install zeigt:

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}, 
    ... 

Kein Glück mit dem easy_install Route noch.

+2

Ich habe gerade herausgefunden, dass das Aufrufen von 'setuptools.install.install: run()' explizit 'install_requires' Setup-Argument nicht auflöst und es scheint, dass es auf andere Weise funktioniert, wenn Sie das tun – astronaut

+1

@ Astronaut verwenden 'do_egg_install', wie hier beschrieben: http://stackoverflow.com/questions/21915469/python-setuptools-install-requires-is-ignored-when-overriding-cmdclass –

Antwort

7

Es hängt davon ab, wie der Benutzer Ihr Paket installiert. Wenn der Benutzer "setup.py install" ausführt, ist das ziemlich einfach: Fügen Sie einfach einen anderen Unterbefehl zum install-Befehl hinzu (zB install_vim), dessen run() -Methode die gewünschten Dateien an die Stellen kopiert, an denen Sie sie haben wollen. Sie können Ihren Unterbefehl zu install_commands hinzufügen und den Befehl an setup() übergeben.

Wenn Sie ein Post-Installationsskript in einer Binärdatei benötigen, hängt es vom Typ der Binärdatei ab, die Sie erstellen. Beispielsweise unterstützen bdist_rpm, bdist_wininst und bdist_msi Post-Installationsskripts, da die zugrunde liegenden Packformate Post-Installationsskripts unterstützen.

bdist_egg unterstützt keine Post-Installationsmechanismus von Design:

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

+2

" Fügen Sie einfach einen weiteren Unterbefehl zum Befehl install (sagen wir, install_vim) "Und wie macht man das? –

+0

Irgendwelche Updates dazu? – MavWolverine

+2

Für die Antwort, ** schaue auf den unteren Teil der _question_ oben **. (@ Limp-Chimp, @ Maverick-Vielfraß) –

0

Als Behelfslösung, könnten Sie die zip_ok Option auf false gesetzt, so dass Ihr Projekt als entpackten Verzeichnis installiert ist , dann wird es für Ihre Benutzer ein wenig einfacher sein, die Editor-Konfigurationsdatei zu finden.

In distutils2 ist es möglich, Dinge in mehreren Verzeichnissen, einschließlich benutzerdefinierter Verzeichnisse, zu installieren und Hooks vor/nach der Installation/Entfernung zu haben.