Что делать с файлами pyc, когда Django или python используются с Mercurial?

Просто начал использовать Mercurial. Ух, хорошее приложение. Я переместил файл своей базы данных из директории кода, но мне было интересно .pyc файлы. Я не включил их в первоначальный коммит. Документация о .hgignore файл содержит пример для исключения *.pycЯ думаю, что я на правильном пути.

Мне интересно, что произойдет, когда я решу вернуться к старому набору файлов. Нужно ли мне удалить все .pyc файлы то? Я видел несколько вопросов о переполнении стека по этому вопросу, в том числе один джентльмен, который нашел старый .pyc файлы были использованы. Каков стандартный способ обойти это?

4 ответа

Решение

Как упоминалось в ответе ms4py, *.pyc - это скомпилированные файлы, которые будут восстановлены на лету. Вы не хотели бы включать их при распространении проекта.

Однако, если это происходит, у вас есть модули, которые существовали раньше, когда вы откатываете изменения, и файлы *.pyc остаются без изменений, могут появиться странные ошибки, поскольку файлы pyc могут выполняться, даже если исходный файл python больше не существует. Это укусило меня несколько раз в Django при добавлении и удалении приложений в проекте и переключении веток с помощью git.

Чтобы все исправить, вы можете удалить все скомпилированные файлы в каталоге вашего проекта, выполнив следующую команду оболочки в каталоге вашего проекта:

find . -name '*.pyc' -exec rm {} \;

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

Это проблематично, если вы удалите *.py файл, и вы все еще импортируете из него в другой файл. В этом случае вы импортируете из *.pyc файл, если он существует. Но это будет ошибка в вашем коде и не имеет никакого отношения к вашему рабочему процессу.

Вывод: каждая известная библиотека Python игнорирует их *.pyc файлы, просто сделай это;)

Чтобы найти более общее решение, спросите у самого Mercurial, какие файлы он игнорирует:

$ hg status --ignored

Вы можете сделать вывод безопасным для xargs расход:

$ hg status --ignored --no-status -0 | xargs -0 -delete

(The -0 важно обрабатывать файлы с пробелами в имени.) Вы можете установить это как хук после обновления:

[hooks]
post-update = hg status --ignored --no-status -0 | xargs -0 -delete

Наконец, Mercurial поставляется с расширением очистки, которое выполняет нечто подобное:

$ hg purge --all

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

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

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

Если вы используете Linux, вы можете find . -name *.pyc -delete

Другие вопросы по тегам