Мне нужно запустить простой script после установки модулей и программ. У меня есть небольшая проблема с поиском прямой документации о том, как это сделать. Похоже, мне нужно наследовать distutils.command.install, переопределить некоторые методы и добавить этот объект в настройку script. Специфичность немного туманна, и, похоже, для такого простого крючка это требует больших усилий. Кто-нибудь знает простой способ сделать это?
Как расширить distutils с простой установкой post script?
Ответ 1
Я вырыл через источник 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), ...)
Ответ 2
ОК, я понял это. Идея состоит в том, чтобы в основном расширить одну из команд 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},
...
)
Надеюсь, это поможет кому-то другому.
Ответ 3
Я не мог сделать Joe Wreschnig ответить на работу и настроить его ответ, аналогичный расширяющимся 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})
Примечание. Я не редактировал ответ Джо, так как я не уверен, почему его ответ не работал на моей машине.
Ответ 4
У меня возникла ошибка, когда я попробовал принятый ответ здесь (возможно, потому, что я использую 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
терпит неудачу более подробно, но также с ошибкой: опция - единая версия-внешняя управляемая не распознается
Изменение принятого ответа
Замена импорта из distutils на setuptools решила проблему для меня:
from setuptools import setup
from setuptools.command.install import install