Очистка каталога сборки в setup.py

Как я могу сделать так, чтобы мой setup.py предварительно удалял и удалял каталог сборки?


person Ram Rachum    schedule 20.10.2009    source источник


Ответы (4)


Для предварительного удаления просто удалите его с помощью distutils.dir_util.remove_tree перед вызовом установки.

Для пост-удаления я предполагаю, что вы хотите пост-удалить только после выбранных команд. Создайте подкласс соответствующей команды, переопределите ее метод запуска (для вызова remove_tree после вызова базового запуска) и передайте новую команду в словарь cmdclass установки.

person Martin v. Löwis    schedule 20.10.2009

Отвечает ли это? IIRC, вам нужно будет использовать флаг --all, чтобы избавиться от вещей за пределами build/lib:

python setup.py clean --all
person Matt Ball    schedule 20.10.2009
comment
Кажется, не все setup.py скрипты поддерживают clean. Пример: NumPy - person kevinarpe; 15.06.2016
comment
clean работает в моем случае для некоторых файлов, но, например. каталог .egg остается там... есть ли способ провести глубокую очистку? - person ntg; 20.05.2020
comment
аааа, и в моем случае был makefile, так что я мог make clean оттуда... (простой модуль, созданный с помощью cookiecutter) - person ntg; 20.05.2020
comment
К сожалению, это также не очищает каталоги dist и egg-info, поэтому я просто создал сценарий оболочки для rm -rf ./build ./dist ./*egg-info, позволив конфигурации запуска PyCharm управлять рабочим каталогом. - person hlongmore; 02.07.2020

Это очищает каталог сборки перед установкой

python setup.py clean --all install

Но в соответствии с вашими требованиями: Это сделает это до и после

python setup.py clean --all install clean --all
person Adrian Lopez    schedule 20.01.2017
comment
Второй clean --all игнорируется. Я пробовал следующее python3 ./setup.py clean --all install clean --all, и каталог build сохраняется. В выводе ни слова об очистке после install. - person Hans Deragon; 16.07.2020

Вот ответ, который сочетает в себе программный подход ответа Мартина с функциональностью ответа Мэтта (clean, который заботится обо всех возможных областях сборки):

from distutils.core import setup
from distutils.command.clean import clean
from distutils.command.install import install

class MyInstall(install):

    # Calls the default run command, then deletes the build area
    # (equivalent to "setup clean --all").
    def run(self):
        install.run(self)
        c = clean(self.distribution)
        c.all = True
        c.finalize_options()
        c.run()

if __name__ == '__main__':

    setup(
        name="myname",
        ...
        cmdclass={'install': MyInstall}
    )
person Alan    schedule 14.05.2015
comment
чтобы просто запускать одну команду за другой, псевдоним кажется лучшим решением: setuptools.readthedocs.io/en/latest/ - person Florian; 08.03.2019
comment
@Florian, я полагаю, что псевдоним может быть лучшим решением в некоторых ситуациях. Однако в моей ситуации я создаю файл setup.py один раз для каждого создаваемого пакета. Внесение логики в шаблон, создающий файл setup.py, требует единовременных затрат. - person Alan; 08.03.2019