2008-10-30 4 views
32

Я хотел был бы иметь возможность добавить крючок к моей setup.py, которая будет запущена после установки (либо когда easy_install'ing, либо при установке python setup.py install).Как добавить скрипты после установки в easy_install/setuptools/distutils?

В моем проекте PySmell у меня есть файлы поддержки для Vim и Emacs. Когда пользователь устанавливает PySmell обычным способом, эти файлы копируются в фактическое яйцо, и пользователь должен выловить их и поместить в свои каталоги .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 = '[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:

Вот заглушки, которая не демонстрирует 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 маршрут еще.

+2

Я только что узнал, что вызов `setuptools.install.install: run()` явно не разрешает параметр установки install_requires`, и кажется, что он работает по-другому, когда вы это делаете – astronaut 2013-09-22 13:11:04

+1

@astronaut use `do_egg_install`, как описано здесь: http://stackoverflow.com/questions/21915469/python-setuptools-install-requires-is-ignored-when-overriding-cmdclass – 2015-03-27 12:57:14

ответ

7

Это зависит от того, как пользователь устанавливает ваш пакет. Если пользователь действительно запускает «setup.py install», это довольно просто: просто добавьте еще одну подкоманду в команду установки (скажем, install_vim), метод которой() будет скопировать нужные вам файлы в тех местах, где вы их хотите. Вы можете добавить свою подкоманду в команду install.sub_commands и передать команду в setup().

Если вы хотите создать сценарий после установки в двоичном формате, это зависит от типа создаваемого вами двоичного файла. Например, bdist_rpm, bdist_wininst и bdist_msi поддерживают пост-установочные скрипты, поскольку базовые форматы упаковки поддерживают сценарии после установки.

bdist_egg не поддерживает послеустановочный механизм проектирование:

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

0

В работе вокруг, вы можете установить опцию zip_ok ложь, чтобы ваш проект будет установлен в качестве распакованной директории , то пользователям будет легче найти файл конфигурации редактора.

В distutils2 можно будет установить вещи в другие каталоги, в том числе в пользовательские каталоги, а также иметь до/после установки/удаления крючки.