2012-06-06 17 views
7

Acabo de comenzar a utilizar Mercurial. Guau, buena aplicación. Moví mi archivo de base de datos fuera del directorio de código, pero me preguntaba sobre los archivos .pyc. No los incluí en la confirmación inicial. La documentación sobre el archivo .hgignore incluye un ejemplo para excluir *.pyc, así que creo que estoy en el camino correcto.¿Qué hacer con los archivos pyc cuando se usa Django o python con Mercurial?

Me pregunto qué pasará cuando decida retroceder a un conjunto de archivos anterior. ¿Debo eliminar todos los archivos .pyc? Vi algunas preguntas sobre Stack Overflow sobre el problema, incluido un caballero que encontró que se estaban utilizando archivos antiguos .pyc. ¿Cuál es la forma estándar de esto?

+0

¿Utiliza Mercurial en Linux? ¿Y usas la línea de comando 'hg' app o algún tipo de aplicación GUI? – Kirill

+1

Prefiero configurar PYTHONDONTWRITEBYTECODE durante el desarrollo para evitar dolores de cabeza pyc por completo. – georg

+0

-> Kirill: Estoy usando Mercurial en MacOS X para el desarrollo web de Django para mi práctica médica. Es divertido ver archivos entrar y salir en la GUI cuando la aplicación de línea de comandos hg funciona de maravilla. -> thg435: Gracias por señalar la opción PYTHONDONTWRITEBYTECODE. – kd4ttc

Respuesta

13

Como se mencionó en la respuesta de ms4py, * .pyc son archivos que se pueden regenerar compilado sobre la marcha. No querrás incluirlos cuando distribuyas un proyecto.

Sin embargo, si ocurre que hay módulos que existían antes cuando revierte los cambios y los archivos * .pyc se dejan tirados, pueden aparecer extraños errores ya que los archivos pyc pueden ejecutarse aunque el archivo python original no exista nunca más. Esto me ha mordido un par de veces en Django al agregar y eliminar aplicaciones en un proyecto y al cambiar de sucursales con git.

Para limpiar las cosas, puede eliminar todos los archivos compilados en el directorio de su proyecto mediante la ejecución del siguiente comando del shell en el directorio del que proyecto:

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

La mayoría de los 'find's también admiten' -delete' en su lugar de '-exec rm {} \;'. – Dougal

+1

Si su código base no tiene errores, este problema no se produce dentro del flujo de trabajo mercurial predeterminado (porque nunca se importa desde un * .pyc que no tenga * .py correspondiente). – schlamar

+1

OK, así que parece que lo correcto es hacer 'hg commit' a intervalos. Si retrocede, ejecute 'find. -name '* .pyc' -delete' después de la reversión como una opción. Es bueno excluir archivos * .pyc en general de Mercurial. – kd4ttc

0

Claro, si tiene un archivo .pyc de una versión anterior del mismo módulo, python lo usará. Muchas veces me he preguntado por qué mi programa no reflejaba los cambios que hice, y me di cuenta de que era porque tenía archivos pyc viejos.

Si esto significa que .pyc no están reflejando su versión actual, entonces sí, tendrá que eliminar todos los archivos .pyc.

Si está en Linux Puede find . -name *.pyc -delete

+2

¿Cómo responde esto la pregunta? El OP menciona ignorar '.pyc' en VCS ya. –

+0

Según tengo entendido por la pregunta, @ kd4ttc ya ha hecho esto. – Kirill

5

Por lo general, son seguros, porque *.pyc son regenerados si el *.py correspondiente cambia su contenido.

Es problemático si elimina un archivo *.py y aún está importando de él en otro archivo. En este caso, usted está importando desde el archivo *.pyc si es que existe. Pero esto será un error en su código y no está realmente relacionado con su flujo de trabajo mercurial.

Conclusión: Cada biblioteca de Python famosa está ignorando sus archivos *.pyc, sólo lo hacen;)

+1

Estoy de acuerdo. En su mayor parte, las cosas "simplemente funcionan". Si obtiene un comportamiento extraño de su proyecto (el código que se está ejecutando que * sabe * ya no está allí, por ejemplo), elimine sus archivos * .pyc. De lo contrario, no te preocupes por eso. –

+0

Si está eliminando módulos pero todavía los está importando, esperando un ImportError en lugar de cargar un archivo .pyc antiguo, eso es probablemente una señal de que está haciendo algo extraño ... – geoffspear

3

Para una solución más general, a continuación, pedir Mercurial sí acerca qué archivos se ignora:

$ hg status --ignored 

que pueda tomar la salida segura para el consumo xargs:

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

(El -0 es importante para manejar archivos con espacios en el nombre.) Se puede instalar como un gancho posterior a la actualización

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

Por último, Mercurial viene con un purge extension que hace algo similar:

$ hg purge --all 

borrará ambos archivos sin seguimiento e ignorados. Si está de acuerdo con la pérdida de archivos sin seguimiento, entonces ese comando es probablemente el más fácil para usted, en particular porque también funciona en Windows, donde xargs puede ser difícil de encontrar.

Cuestiones relacionadas