Автоматическое удаление файлов pyc при перемещении соответствующего py (Mercurial) - PullRequest
15 голосов
/ 27 марта 2010

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

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

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

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

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

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

Ответы [ 7 ]

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

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

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

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

6 голосов
/ 27 марта 2010

Вам нужно:

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

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

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

3 голосов
/ 27 марта 2010

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

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

2) В краткосрочной перспективе я принял концепцию ловушки обновления 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)

Мои хуки обновления теперь вызывают это, а не команды "поиска", предложенные другими.

2 голосов
/ 06 ноября 2014

Вот однострочник Unix, который будет удалять .pyc файлы каждый раз, когда вы запускаете hg update.

Добавьте это в файл hgrc:

[hooks]
preupdate.cleanpyc = hg status --no-status --removed --deleted --include "**.py" --rev .:$HG_PARENT1 --print0 | xargs -0 -I '{}' rm -f '{}c'

Он запускается непосредственно перед обновлением и получает все файлы .py, которые будут удалены или удалены при выполнении обновления, а затем удаляет соответствующие файлы .pyc.

Вот краткое описание того, как это работает:

hg status --no-status --removed --deleted --include "**.py" --rev .:$HG_PARENT1

При этом удаляются все файлы (например, hg forget) или удаляются (hg rm, hg mv и т. Д.) Между текущей версией . и пунктом назначения ($HG_PARENT). Вы можете добавить --subrepos, чтобы также получить все изменения в под-репозиториях, если вы используете эту функцию.

xargs -0 -I '{}' rm -f '{}c'

Это просто добавляет 'c' в конец каждого имени файла, возвращаемого из hg status, и пытается его удалить. Флаг -f для rm гарантирует отсутствие ошибок, если файл .pyc не существует.

Обратите внимание, что mercurial автоматически удаляет пустые каталоги после обновления, но потерянные файлы .pyc часто приводят к тому, что каталоги остаются. Поскольку это выполняется перед обновлением, оно гарантирует, что пустые каталоги будут правильно удалены.

1 голос
/ 27 марта 2010

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

# use glob syntax.
syntax: glob

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

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

0 голосов
/ 26 августа 2015

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

import os
files = [f for f in os.listdir('.') if os.path.isfile(f) and '.pyc' in str(f)]
for f in files : os.unlink(os.getcwd()+'/'+f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...