2012-06-06 16 views
7

Właśnie zaczął używać Mercurial. Wow, dobra aplikacja. Przeniosłem plik bazy danych z katalogu kodu, ale zastanawiałem się nad plikami .pyc. Nie uwzględniłem ich przy pierwszym zatwierdzeniu. Dokumentacja dotycząca pliku .hgignore zawiera przykład wyłączenia *.pyc, więc myślę, że jestem na dobrej drodze.Co zrobić z plikami Pyc, gdy Django lub Python jest używany z Mercurial?

Zastanawiam się, co się stanie, gdy zdecyduję się wrócić do starszego zestawu plików. Czy muszę wtedy usunąć wszystkie pliki .pyc? Widziałem kilka pytań dotyczących Stack Overflow dotyczących tego problemu, w tym jeden dżentelmen, który odnalazł stare pliki. Jaki jest standardowy sposób obejścia tego?

+0

Czy używasz Mercurial pod Linuksem? Czy używasz aplikacji 'hg' w linii poleceń lub jakiejś aplikacji GUI? – Kirill

+1

Wolę ustawienie PYTHONDONTWRITEBYTECODE podczas programowania, aby uniknąć problemów z pamięcią typu PIC. – georg

+0

-> Kirill: Używam Mercurial pod MacOS X do tworzenia stron internetowych Django dla mojej praktyki medycznej. To zabawne oglądanie plików przychodzących i wychodzących w GUI, gdy aplikacja HG działająca w wierszu poleceń działa magicznie. -> thg435: Dzięki za wskazanie opcji PYTHONDONTWRITEBYTECODE. – kd4ttc

Odpowiedz

13

Jak wspomniano w odpowiedzi na ms4py * .pyc zestawiane są pliki, które zostaną utworzone w locie. Nie chciałbyś ich uwzględnić podczas dystrybucji projektu.

Jeśli jednak zdarzy się, że masz moduły, które istniały wcześniej, po wycofaniu zmian i * pliki .pyc pozostają w pobliżu, mogą pojawiać się dziwne błędy, ponieważ pliki Pyc mogą być uruchamiane, nawet jeśli oryginalny plik Pythona nie istnieje już. To mnie ugryzło kilka razy w Django podczas dodawania i usuwania aplikacji w projekcie oraz przełączania gałęzi za pomocą git.

Aby wyczyścić rzeczy, można usunąć co skompilowane pliki w katalogu Twojego projektu, uruchamiając następujące polecenie powłoki w katalogu projektu:

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

Większość 'find's również obsługuje' -delete' zamiast z '-exec rm {} \;'. – Dougal

+1

Jeśli baza kodu jest wolna od błędów, ten problem nie występuje w domyślnym przepływie pracy (ponieważ nigdy nie importujesz z pliku * .pyc, który nie ma odpowiadającego * .py). – schlamar

+1

OK, więc wygląda na to, że właściwą rzeczą jest robienie 'hg commit' w określonych odstępach czasu. Jeśli cofniesz się, uruchom 'find. -name '* .pyc' - usuń po wycofaniu jako opcję. Dobrze jest wykluczyć pliki * .pyc ogólnie z Mercurial. – kd4ttc

0

Oczywiście, jeśli masz plik .pyc ze starszej wersji tego samego modułu, użyje go python. Wiele razy zastanawiałem się, dlaczego mój program nie odzwierciedla zmian, które wprowadziłem, i uświadomiłem sobie, że to dlatego, że miałem stare pliki Pyc.

Jeśli oznacza to, że .pyc nie odzwierciedlają twojej aktualnej wersji, to tak, będziesz musiał usunąć wszystkie pliki .pyc.

Jeśli jesteś na Linuksie można find . -name *.pyc -delete

+2

Jak to odpowiada na pytanie? OP wspomina już o ignorowaniu '.pyc' w VCS. –

+0

Jak rozumiem z pytania, @ kd4ttc już to zrobił. – Kirill

5

Zazwyczaj są bezpieczne, ponieważ *.pyc są regenerowane, jeżeli odpowiedni *.py zmienia swoją zawartość.

Problem jest problematyczny w przypadku usuwania pliku *.py i nadal trwa importowanie go w innym pliku. W takim przypadku importujesz z pliku *.pyc, jeśli istnieje. Będzie to jednak błąd w twoim kodzie i nie będzie tak naprawdę związany z twoim przepływem pracy mercurialnej.

Wnioski: Każdy słynny biblioteka Pythona jest ignorowanie ich *.pyc plików, zrób to;)

+1

Zgadzam się. W przeważającej części rzeczy "po prostu działają". Jeśli zauważysz dziwne zachowanie ze swojego projektu (uruchamiany kod, na którym * wiesz * już nie ma, na przykład), usuń pliki * .pyc. W przeciwnym razie nie martw się o to. –

+0

Jeśli usuwasz moduły, ale wciąż je importujesz, spodziewasz się, że ImportError zamiast ładować stary plik .pyc, to prawdopodobnie znak, że robisz coś dziwnego ... – geoffspear

3

Dla bardziej ogólnego rozwiązania, a następnie poprosić sama Mercurial o które pliki ignoruje:

$ hg status --ignored 

można zrobić bezpieczne wyjście dla xargs spożycia:

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

(Numer -0 jest ważny w przypadku plików zawierających spacje w nazwie.) Można zainstalować to jako hakiem po aktualizacji:

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

Wreszcie Mercurial pochodzi z purge extension że robi coś podobnego:

$ hg purge --all 

spowoduje usunięcie zarówno nieśledzone i ignorowane pliki. Jeśli nic nie stoi na przeszkodzie, aby utracić niepotwierdzone pliki, to polecenie jest prawdopodobnie najłatwiejsze, w szczególności dlatego, że działa również w systemie Windows, gdzie trudno uzyskać xargs.