Что именно делает setup.py clean?

Вызывая вызов setup из setuptools с версией 0.9.6, я могу выполнить следующую команду:

python setup.py clean

Но что именно это делает? Справка по этой команде немного скудна и работает

python setup.py clean --all

дает бесполезные заявления, такие как

'build/lib.linux-i686-2.7' does not exist -- can't clean it

Есть ли возможность использовать эту команду clean, например. автоматически очищать временные файлы Python, заканчивающиеся на .pyc и .~? Можно ли это сделать с помощью этой команды, нужно ли ее настраивать, ...?


person Alex    schedule 23.07.2013    source источник
comment
Из интереса, зачем вам дополнительное поведение? Я могу себе представить, что приятно иметь чистый каталог, но в целом это не то, с чем вам следует беспокоиться. Какая-то конкретная причина?   -  person    schedule 23.07.2013
comment
Я хочу дополнительное поведение, чтобы указать просто каталог, из которого весь контент берется в пакет. Без предварительного удаления временных файлов Python все эти временные файлы будут использоваться при упаковке, не так ли? Также команду clean можно использовать для простой очистки рабочего каталога от временных файлов, чтобы четко видеть, что у вас есть.   -  person Alex    schedule 24.07.2013
comment
Для упаковки рассмотрите возможность использования setup.py sdist. Что касается очистки: *.pyc файлов на самом деле не должно быть проблемой, но вы можете рассмотреть find . -name "*.pyc" | xargs rm. Эти файлы *~ не должны беспокоить Python, поскольку они не связаны с Python (это может относиться и к нескольким другим типам файлов).   -  person    schedule 24.07.2013
comment
Использование xargs таким образом опасно. вместо этого используйте find -delete.   -  person mic_e    schedule 15.10.2014
comment
@mic_e Не по теме, но не могли бы вы вкратце объяснить, почему это опасно? Или, возможно, предоставить (а) ссылку (ы)?   -  person    schedule 16.10.2014
comment
Представьте, что есть файл, содержащий пробелы: a b. вместо этого файлы a и b будут удалены. Еще хуже: представьте себе файл -rf .. Вместо этого будет удален весь каталог. Более безопасным способом использования xargs будет find -print0 | xargs -0 rm --, который будет выполнять правильную задачу в обоих сценариях, но find -delete проще всего.   -  person mic_e    schedule 16.10.2014
comment


Ответы (1)


Насколько мне известно, он просто удаляет подкаталог build, куда Python помещает все файлы для установки, включая расширения, которые необходимо скомпилировать.

В других местах не должно быть никаких файлов *.pyc, если только вы не запустили Python для некоторых скриптов в исходном каталоге (что может произойти, если вы запускаете тесты) или не импортировали модули непосредственно из исходного каталога. *~ файлы являются файлами резервных копий emacs, и поэтому setup.py их все равно не очистит. (Если вы видели такое поведение из make clean, то это просто потому, что кто-то закодировал это в Makefile.)

Вероятно, вы могли бы переопределить команду очистки таким образом, чтобы (рекурсивно) удалить файлы *.pyc, но я сомневаюсь, что в этом есть необходимость. В общем, Python достаточно умен, чтобы перекомпилировать файлы *.py в файлы *.pyc, если первые изменились, а в противном случае использование последних будет просто быстрее.

Есть одно предостережение, с которым я столкнулся, и это то, что при выполнении setup.py build_ext --inplace очистка не удалит скомпилированные модули, поскольку они не находятся в каталоге сборки. Что мне кажется недостатком чистой команды.

В целом, похоже, что команда очистки была добавлена, чтобы соответствовать поведению make, но, похоже, она мало что добавляет.

person Community    schedule 23.07.2013
comment
См. другой комментарий: Когда я создаю пакет, я хочу сначала избавиться от временных файлов. Я не хочу, чтобы они были частью пакета. - person Alex; 24.07.2013
comment
Если я использовал setup.py build_ext --inplace, есть ли способ удалить все скомпилированные модули? - person Garrett; 30.11.2014
comment
@Garrett Если это просто чистые модули Python, вы можете использовать (модифицированное) предложение поиска в комментариях к вопросу: find -name "*pyc" -delete. Если есть другие файлы (скомпилированные из исходных файлов Cython или C), все сложнее, и вы можете попробовать запустить команду find для каждого типа файлов. - person ; 30.11.2014
comment
Насколько мне известно, можете ли вы подтвердить, что действительно пробовали python setup.py clean, прежде чем публиковать этот ответ? Для меня это не удаляет build/, если я не использую --all! - person Adam Spiers; 12.06.2016