Как расширить distutils с помощью простого скрипта после установки? - PullRequest
38 голосов
/ 24 августа 2009

Мне нужно запустить простой скрипт после установки модулей и программ. У меня небольшие проблемы с поиском прямой документации о том, как это сделать. Похоже, мне нужно наследовать от distutils.command.install, переопределить некоторые методы и добавить этот объект в сценарий установки. Специфика немного туманная, и кажется, что для такой простой зацепки нужно приложить немало усилий. Кто-нибудь знает простой способ сделать это?

Ответы [ 4 ]

33 голосов
/ 24 августа 2009

Я копался в источнике distutils в течение дня, чтобы узнать достаточно об этом, чтобы создать кучу пользовательских команд. Это не красиво, но работает.

import distutils.core
from distutils.command.install import install
...
class my_install(install):
    def run(self):
        install.run(self)
        # Custom stuff here
        # distutils.command.install actually has some nice helper methods
        # and interfaces. I strongly suggest reading the docstrings.
...
distutils.core.setup(..., cmdclass=dict(install=my_install), ...)
16 голосов
/ 24 августа 2009

ОК, я понял это.Идея состоит в том, чтобы расширить одну из команд distutils и переписать метод run.Чтобы сообщить distutils использовать новый класс, вы можете использовать переменную cmdclass.

from distutils.core import setup
from distutils.command.install_data import install_data

class post_install(install_data):
    def run(self):
        # Call parent 
        install_data.run(self)
        # Execute commands
        print "Running"

setup(name="example",
      cmdclass={"install_data": post_install},
      ...
      )

Надеюсь, это поможет кому-то еще.

7 голосов
/ 21 июня 2012

Я не смог заставить Джо Вершнига ответить на вопрос и подправил свой ответ аналогично расширенной документации distutils . Я придумал этот код, который отлично работает на моей машине.

from distutils import core
from distutils.command.install import install
...
class my_install(install):
    def run(self):
        install.run(self)
        # Custom stuff here
        # distutils.command.install actually has some nice helper methods
        # and interfaces. I strongly suggest reading the docstrings.
...
distutils.core.setup(..., cmdclass={'install': my_install})

Примечание: я не редактировал ответ Джо, поскольку не уверен, почему его ответ не работал на моей машине.

0 голосов
/ 30 октября 2013

Я получил сообщение об ошибке при попытке принять принятый здесь ответ (возможно, потому, что я использую Python 2.6 в данном конкретном случае, не уверен). Это произошло как для 'setup.py install', так и 'pip install':

sudo python setup.py install

терпит неудачу с ошибка: ошибка в setup.cfg: команда 'my_install' не имеет такой опции 'single_version_externally_managed'

И

sudo pip install . -U

терпит неудачу более подробно, но также и с ошибка: опция --single-version-внешне управляемая не распознается

Вариация принятого ответа

Замена импорта из distutils на setuptools решила проблему для меня:

from setuptools import setup
from setuptools.command.install import install
...