Z tego, co rozumiem, pamięć podręczna jest zaszyfrowanym plikiem podobnych plików.
Co robimy z __pycache__
folderem? Czy to jest to, co dajemy ludziom zamiast naszego kodu źródłowego? Czy to tylko moje dane wejściowe? Ten folder jest ciągle tworzony, do czego służy?
python
python-3.x
caching
użytkownik2063042
źródło
źródło
Python 3.8
możesz użyć zmiennej środowiskowej, aby zmienić lokalizację irytujących katalogów pamięci podręcznej: stackoverflow.com/a/57414308/1612318Odpowiedzi:
Po uruchomieniu programu w Pythonie interpreter najpierw kompiluje go do kodu bajtowego (jest to uproszczenie) i zapisuje go w
__pycache__
folderze. Jeśli tam zajrzysz, w folderze projektu znajdziesz kilka plików o wspólnych nazwach plików .py, tylko ich rozszerzenia będą w formacie .pyc lub .pyo. Są to odpowiednio skompilowane przez kod bajtowy wersje plików programu.Jako programista możesz w dużej mierze po prostu zignorować ... Wszystko, co robi, to przyspieszyć uruchomienie programu. Gdy skrypty się zmienią, zostaną one ponownie skompilowane, a jeśli usuniesz pliki lub cały folder i uruchomisz program ponownie, pojawią się ponownie (chyba że wyraźnie powstrzymasz to zachowanie)
Jeśli używasz cpython (który jest najczęstszy, ponieważ jest to implementacja referencyjna) i nie chcesz tego folderu, możesz go wyłączyć, uruchamiając na przykład interpreter z flagą -B
Inną opcją, jak zauważył tcaswell, jest ustawienie zmiennej środowiskowej
PYTHONDONTWRITEBYTECODE
na dowolną wartość (zgodnie ze stroną podręcznika Pythona, dowolny „niepusty ciąg”).źródło
PYTHONDONTWRITEBYTECODE=<any_value>
aby trwale ją wyłączyć.python2
umieszcza skompilowane pliki w tym samym katalogu co oryginały, jeśli się nie mylę.find . -name '*.pyc' -delete
Tak, find ma flagę do usuwania znalezionych plików, więc nie musisz używać żadnych shananiganów xargs__pycache__
to folder zawierający kod bajtowy Pythona 3 skompilowany i gotowy do uruchomienia .Nie polecam rutynowego usuwania tych plików lub tłumienia tworzenia podczas programowania, ponieważ może to obniżyć wydajność. Po prostu przygotuj komendę rekurencyjną (patrz poniżej), aby wyczyścić ją w razie potrzeby, ponieważ kod bajtowy może stać się przestarzały w przypadkach na krawędzi (patrz komentarze).
Programiści Python zwykle ignorują kod bajtowy. Rzeczywiście
__pycache__
i*.pyc
są to wspólne linie do zobaczenia w.gitignore
plikach. Kod bajtowy nie jest przeznaczony do dystrybucji i można go zdemontować za pomocądis
modułu .Jeśli korzystasz z systemu OS X, możesz łatwo ukryć wszystkie te foldery w projekcie, uruchamiając następujące polecenie z folderu głównego projektu.
Wymień
__pycache__
się*.pyc
dla Pythona 2.Ustawia to flagę we wszystkich tych katalogach (plikach .pyc), informując Finder / Textmate 2 o wykluczeniu ich z listy. Co ważne, kod bajtowy jest tam ukryty.
Uruchom ponownie polecenie, jeśli tworzysz nowe moduły i chcesz ukryć nowy kod bajtowy lub jeśli usuwasz ukryte pliki kodu bajtowego.
W systemie Windows równoważne polecenie może być (nie testowane, mile widziane skrypty wsadowe):
To samo, co przeglądanie folderów projektu za pomocą kliknięcia prawym przyciskiem myszy> ukryj ...
Przeprowadzanie testów jednostkowych to jeden scenariusz (więcej w komentarzach), w którym usuwanie
*.pyc
plików i__pycache__
folderów jest rzeczywiście przydatne. Używam następujących wierszy~/.bash_profile
i po prostu biegam,cl
aby wyczyścić w razie potrzeby.źródło
__pycache__
Folder jest tworzony podczas korzystania z linii:lub spróbuj uzyskać informacje z innego utworzonego pliku. To sprawia, że przy drugim uruchomieniu programu drugi plik jest nieco szybszy.
źródło
Zaktualizowana odpowiedź z dokumentów w wersji 3.7+:
Źródło: https://docs.python.org/3/tutorial/modules.html#compiled-python-files
Oznacza to, że ten katalog jest generowany przez Python i istnieje, aby przyspieszyć działanie programów. Nie powinien być zaangażowany w kontrolę źródła i powinien współistnieć w zgodzie z lokalnym kodem źródłowym.
__pycache__
to katalog zawierający pliki pamięci podręcznej kodu bajtowego, które są automatycznie generowane przez python, a mianowicie skompilowane.pyc
pliki python lub . Być może zastanawiasz się, dlaczego Python, język „interpretowany”, ma w ogóle jakieś skompilowane pliki. To SO pytanie dotyczy (i zdecydowanie warto przeczytać tę odpowiedź ).Dokumenty Pythona są bardziej szczegółowe na temat tego, jak to działa i dlaczego istnieje:
.pyc
plików w tym samym katalogu powodował różne problemy, na przykład podczas uruchamiania programu z interpreterami Pythona różnych wersji. Aby uzyskać pełną specyfikację funkcji, zobacz PEP 3174 .źródło
z oficjalnego tutoriala Python Moduły
z Python doc Często zadawane pytania dotyczące programowania
źródło
Wykonanie skryptu python spowodowałoby wygenerowanie kodu bajtowego w pamięci i zachowanie go do momentu zamknięcia programu. W przypadku importu modułu, w celu szybszego ponownego użycia, Python utworzy plik .pyc pamięci podręcznej (PYC to „skompilowana” wersja „Pythona”), w której buforowany jest kod bajtu importowanego modułu. Chodzi o to, aby przyspieszyć ładowanie modułów Pythona, unikając ponownej kompilacji (kompiluj raz, uruchamiaj zasady wielokrotnie) podczas ich ponownego importowania.
Nazwa pliku jest taka sama jak nazwa modułu. Część po początkowej kropce wskazuje implementację Pythona, która utworzyła pamięć podręczną (może to być CPython), a następnie jej numer wersji.
źródło
Interpreter Pythona kompiluje plik skryptu * .py i zapisuje wyniki kompilacji w
__pycache__
katalogu.Gdy projekt zostanie ponownie wykonany, jeśli interpreter stwierdzi, że skrypt * .py nie został zmodyfikowany, pomija krok kompilacji i uruchamia wcześniej wygenerowany plik * .pyc zapisany w
__pycache__
folderze.Gdy projekt jest złożony, możesz skrócić czas przygotowania do uruchomienia projektu. Jeśli program jest zbyt mała, można zignorować, że korzystając
python -B abc.py
z tejB
opcji.źródło
Python w wersji 2.x będzie miał .pyc, gdy interpreter skompiluje kod.
Python w wersji 3.x będzie miał __pycache__, gdy interpreter skompiluje kod.
źródło
W wersji 3.2 i nowszych Python zapisuje skompilowane pliki kodu bajtowego .pyc w podkatalogu o nazwie
__pycache__
zlokalizowanym w katalogu, w którym znajdują się pliki źródłowe, z nazwami plików, które identyfikują wersję Pythona, która je utworzyła (np. Script.cpython-33.pyc)źródło
Po zaimportowaniu modułu ,
Python przechowuje skompilowany kod bajtowy w
__pycache__
katalogu, aby przyszłe importy mogły z niego korzystać bezpośrednio, bez konieczności ponownego analizowania i kompilowania źródła.Nie robi to tylko w celu uruchomienia skryptu, tylko podczas importowania pliku.
(Poprzednie wersje służyły do przechowywania buforowanego kodu bajtowego jako plików .pyc, które zajmowały ten sam katalog co pliki .py, ale od wersji Python 3 zostały przeniesione do podkatalogu, aby uporządkować zawartość.)
PYTHONDONTWRITEBYTECODE ---> Jeśli jest ustawiony na niepusty ciąg, Python nie będzie próbował zapisywać plików .pyc podczas importu modułów źródłowych. Jest to równoważne z określeniem opcji -B.
źródło