Как заставить easy_install выполнять пользовательские команды в setup.py?

Я хочу, чтобы мой setup.py выполнял некоторые пользовательские действия помимо простой установки пакета Python (например, установка сценария init.d, создание каталогов и файлов и т. д.). Я знаю, что могу настроить классы distutils/setuptools для выполнения моих собственных действий. Проблема, с которой я сталкиваюсь, заключается в том, что все работает, когда я перехожу в каталог пакета и выполняю «python setup.py install», но мои пользовательские классы, похоже, не выполняются, когда я делаю «easy_install mypackage.tar.gz». Вот мой файл setup.py (для проверки создайте пустой файл myfoobar.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},
)

То же самое происходит, даже если я импортирую «установку» и «установку» из distutils. Любые идеи, как заставить easy_install выполнять мои пользовательские классы?

Чтобы уточнить, я не хочу использовать ничего лишнего, вроде Buildout или Paver.


person Heikki Toivonen    schedule 18.09.2009    source источник


Ответы (2)


Это невозможно сделать. У Enthought есть специальная версия setuptools, которая поддерживает это, но в остальном она находится в системе отслеживания ошибок как элемент списка пожеланий, который обсуждается с июня.

Однако есть способы обмануть систему, и вы можете рассмотреть их. Один из способов состоит в том, чтобы ваш самый важный модуль, тот, который всегда импортируется первым при использовании вашего пакета, выполнял действия после установки при первом вызове. Затем вам нужно очистить за собой и рассмотреть случай, когда вы не можете писать в библиотеку, потому что администратор установил пакет, а первым пользователем является кто-то другой, кроме администратора.

В худшем случае это потребует создания каталога ~/.mypackage для каждого пользователя, использующего пакет, и повторного запуска постустановки по одному разу для каждого нового пользователя. Каждый раз, когда модуль импортируется, он проверяет наличие ~/.mypackage. Если его там нет, он запускает postinstall и создает его. Если он есть, он пропускает постустановку.

person Michael Dillon    schedule 25.10.2009
comment
Не тот ответ, на который я надеялся, но я думаю, что это лучшее, что можно дать, поэтому я награждаю его как ответ. Спасибо! - person Heikki Toivonen; 26.10.2009

Paver выводит инструменты настройки на новый уровень и позволяет создавать собственные задачи. Он позволяет расширить типичный файл setup.py и предоставляет простой способ загрузки среды Paver.

person John Paulett    schedule 18.09.2009
comment
Я знаю, что мог бы использовать что-то дополнительное, например Buildout или, кажется, Paver, чтобы сделать это, но это не то, о чем я прошу. Представьте себе пакет в PyPI, который вы просто хотите, чтобы люди могли установить с помощью easy_install имя_пакета. - person Heikki Toivonen; 19.09.2009
comment
Paver можно использовать таким образом, чтобы easy_install и python setup.py install продолжали работать как обычно. На самом деле, Paver даже не нужно устанавливать, если он настроен правильно. См.: packages.python.org/ Асфальтоукладчик/ - person Randy Syring; 14.03.2011