Автоматически удаляя pyc файлы, когда соответствующий py перемещен (Подвижный)

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

Если я перемещаю один из своих исходных файлов Python в другой каталог, я должен не забыть говорить Подвижный, что он переместился (hg move).

Когда я развертываю новое программное обеспечение на своем сервере с Подвижным, это тщательно удаляет старый файл Python и создает его в новом каталоге.

Однако Подвижный не знает о pyc файле в том же каталоге и оставляет его. Старый pyc используется преимущественно по новому файлу Python другими модулями в том же каталоге.

То, что следует, НЕ является весельем.

Как я могу убедить Подвижный автоматически удалить свой старый pyc файл, когда я перемещаю файл Python? Есть ли другая лучшая практика? Попытка не забыть удалять pyc файл из всех Подвижных репозиториев не работает.

15
задан Oddthinking 27 March 2010 в 05:46
поделиться

5 ответов

Что я сделал на самом деле:

1) Я рассматриваю предложение Николаса Найта об использовании правильной стратегии развертывания. Я читал о Buildout и Collective.hostout, чтобы узнать больше. Мне нужно решить, стоит ли использовать такие тяжеловесные стратегии для относительно простых требований моего проекта.

2) Я взял на вооружение концепцию update hook от Ry4an, в краткосрочной перспективе, пока не решу.

3) Я проигнорировал предупреждение Ry4an о чрезмерности и написал скрипт на Python, чтобы удалять только лишние файлы .pyc.

#!/usr/bin/env python
""" Searches subdirectories of the current directory looking for .pyc files which
    do not have matching .py files, and deletes them.

    This is useful as a hook for version control when Python files are moved.
    It is dangerous for projects that deliberately include Python 
    binaries without source.
"""
import os
import os.path
for root, dirs, files in os.walk("."):
    pyc_files = filter(lambda filename: filename.endswith(".pyc"), files)
    py_files = set(filter(lambda filename: filename.endswith(".py"), files))
    excess_pyc_files = filter(lambda pyc_filename: pyc_filename[:-1] not in py_files, pyc_files)
    for excess_pyc_file in excess_pyc_files:
        full_path = os.path.join(root, excess_pyc_file)
        print "Removing old PYC file:", full_path
        os.remove(full_path)

Теперь мои крючки обновления вызывают его, а не команды "find", предложенные другими.

3
ответ дан 1 December 2019 в 01:16
поделиться

Как насчет использования ловушки обновления на стороне сервера? Поместите это в файл hgrc каталога репозитория .hg :

[hooks]
update = find . -name '*.pyc' | xargs rm

Это приведет к удалению всех файлов .pyc при каждом обновлении на сервере. Если вас беспокоит стоимость восстановления всех файлов .pyc, вы всегда можете немного поумнее в ловушке и удалить только те .pyc, для которых нет .py, но это, вероятно, излишне.

9
ответ дан 1 December 2019 в 01:16
поделиться

Вам необходимо:

1) Реальная инфраструктура развертывания, даже если это просто сценарий оболочки, который все делает. Клонирование / извлечение обновленной копии из системы управления версиями не является стратегией развертывания.

2) Любая система развертывания должна полностью очищать структуру каталогов. Я обычно предпочитаю, чтобы каждое развертывание происходило в новом каталоге, названном с датой + отметкой времени, а символическая ссылка (с таким именем, как «текущий») обновлялась, чтобы указывать на новый каталог. Это дает вам хлебные крошки на каждом сервере, если что-то пойдет не так.

3) Исправить все, что запускает код Python. Новые исходные файлы .py всегда должны иметь приоритет над кешированными файлами .pyc. Если это не то поведение, которое вы наблюдаете, это ошибка, и вам нужно выяснить, почему это происходит.

6
ответ дан 1 December 2019 в 01:16
поделиться
  1. Не хранить файлы .pyc в хранилище.
  2. Автоматизируйте удаление .pyc с помощью: find . -name '*.pyc' -delete
  3. При разработке используйте аргумент -B в Python.
16
ответ дан 1 December 2019 в 01:16
поделиться

Я использую файл .hgignore для пропуска версий всех моих .pyc и .py~ (временные файлы редактора). Например, вот моя версия :

# use glob syntax.
syntax: glob

.directory
*.pyc
*~
*.o
*.tgz
*.tbz2
*.gz
*.bz2

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

1
ответ дан 1 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: