Как заставить easy_install выполнять пользовательские команды в setup.py? - PullRequest
7 голосов
/ 19 сентября 2009

Я хочу, чтобы мой 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},
)

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

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

Ответы [ 2 ]

5 голосов
/ 19 сентября 2009

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

4 голосов
/ 25 октября 2009

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

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

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

...