__pycache__는 무엇입니까?


651

내가 이해 한 바에 따르면 캐시는 비슷한 파일로 암호화 된 파일입니다.

우리는 무엇을해야합니까 __pycache__폴더? 소스 코드 대신 사람들에게 제공하는 것입니까? 내 입력 데이터입니까? 이 폴더는 계속 생성됩니다. 무엇을위한 것입니까?


29
"소스 코드 대신 사람들에게 제공하는 것이냐?" -아니요, 소스 코드를 멋진 설치 패키지로 제공하므로 사용하기 쉽습니다.
Lennart Regebro

79
아직 언급 한 사람은 없지만 캐시에 대한 정의는 기괴합니다. 캐시는 단순히 데이터를 저장 하는 구성 요소이므로 해당 데이터에 대한 향후 요청을 더 빨리 처리 할 수 ​​있습니다 .
Ricardo Cruz


1
Python 3.8환경 변수를 사용 하여 성가신 캐시 디렉토리 의 위치변경할 수 있기 때문에 : stackoverflow.com/a/57414308/1612318
Rotareti

캐시는 다시 필요할 때를 대비하여 사본을 보관하는 것으로, 원본으로 가져 와서 다시 가져와야 할 필요가 없습니다. 원래 장소로가는 것보다 더 빠르도록 설계되었습니다. 정보를 사전 처리하거나 컴파일 할 필요가 없기 때문에 더 빠를 수 있습니다. 또는 RAM의 디스크 캐시 또는 로컬 디스크의 웹 캐시와 같이 더 빠른 스토리지 일 수 있습니다. 본질 상 암호화 된 것은 아니며 (때로는 가능할 수도 있지만) 항상 "유사한 파일"은 아닙니다. 파일, 파일로드, RAM 블록 등이 될 수 있습니다.
rjmunro

답변:


518

파이썬에서 프로그램을 실행하면 인터프리터는 먼저 바이트 코드로 컴파일하고 (이것은 지나치게 단순화 된 것입니다) __pycache__폴더에 저장 합니다. 거기에서 보면 프로젝트 폴더에 .py 파일 이름을 공유하는 많은 파일이 있으며 확장자는 .pyc 또는 .pyo입니다. 이들은 각각 바이트 코드 컴파일 및 최적화 된 바이트 코드 컴파일 버전의 프로그램 파일입니다.

프로그래머는 거의 무시할 수 있습니다 ... 프로그램이 조금 더 빨리 시작하기 만하면됩니다. 스크립트가 변경되면 다시 컴파일되고 파일이나 전체 폴더를 삭제하고 프로그램을 다시 실행하면 해당 동작이 특별히 억제되지 않는 한 다시 나타납니다.

cpython (참조 구현이므로 가장 일반적인)을 사용하고 해당 폴더를 원하지 않는 경우 -B 플래그를 사용하여 인터프리터를 시작하여 억제 할 수 있습니다 (예 :

python -B foo.py

tcaswell이 지적한 또 다른 옵션은 환경 변수 PYTHONDONTWRITEBYTECODE를 임의의 값 으로 설정하는 것입니다 (python의 man 페이지에 따라 "빈 문자열이 아님").


48
환경 변수 PYTHONDONTWRITEBYTECODE=<any_value>를 추가하여 영구적으로 억제 할 수도 있습니다 .
Mark Tolonen 2016 년

11
명확히하기 위해, 이것은 Python 3 전용입니다. 맞습니까?
Joe J

11
@JoeJ 예, 나는 그것이 사실이라고 생각합니다. python2내가 실수하지 않으면 컴파일 된 파일을 원본과 동일한 디렉토리에 넣습니다.
scott_fakename

27
중요한 한 가지주의 사항은 .py 파일이없는 경우 캐시 된 .pyc 파일이 .py 파일 대신 사용된다는 것입니다. 실제로 이것은 모듈을 삭제 (또는 이름 바꾸기)하는 경우에만 발생하므로 일반적인 현상은 아니지만, 머리를 긁고 find를 실행 한 후에 일부 항목이 계속 "있는 경우"있습니다. -name * .pyc | 소스의 xargs rm은 아마도 좋은 첫 반응 일 것입니다.
yacc143

34
find . -name '*.pyc' -delete당신이 어떤 xargs를의 shananigans 사용하지 않아도 예, 발견은, 발견 된 파일을 삭제하기위한 플래그가
블라드 - ardelean

174

__pycache__컴파일되어 실행 준비가 된 Python 3 바이트 코드를 포함하는 폴더 입니다.

정기적으로 이러한 파일을 삭제하거나 개발 중에 생성을 억제하면 성능이 저하 될 수 있으므로 권장하지 않습니다. 바이트 코드가 엣지 경우 부실 수 있으므로 필요할 때 정리하기 위해 재귀 명령을 준비하십시오 (아래 참조).

파이썬 프로그래머는 보통 바이트 코드를 무시합니다. 사실 __pycache__*.pyc에서 볼 수있는 일반적인 라인입니다 .gitignore파일. 바이트 코드는 배포 용이 아니며 dismodule을 사용하여 분해 할 수 있습니다 .


OS X를 사용하는 경우 프로젝트의 루트 폴더에서 다음 명령을 실행하여 프로젝트의 모든 폴더를 쉽게 숨길 수 있습니다.

find . -name '__pycache__' -exec chflags hidden {} \;

교체 __pycache__*.pyc파이썬 2.

그러면 Finder / Textmate 2에게 목록에서 제외하도록 알리는 모든 디렉토리 (.pyc 파일)에 플래그를 설정합니다. 중요하게는 바이트 코드가 있으며 숨겨져 있습니다.

새 모듈을 작성하고 새 바이트 코드를 숨기거나 숨겨진 바이트 코드 파일을 삭제하려면 명령을 다시 실행하십시오.


Windows에서 동등한 명령은 다음과 같습니다 (테스트되지 않음, 배치 스크립트 환영).

dir * /s/b | findstr __pycache__ | attrib +h +s +r

마우스 오른쪽 버튼 클릭> 숨기기를 사용하여 프로젝트 숨기기 폴더를 진행하는 것과 같습니다.


단위 테스트 실행은 *.pyc파일과 __pycache__폴더를 삭제하는 것이 실제로 유용한 시나리오 중 하나입니다 (설명에 더 있음) . 나는 내에서 다음 줄을 사용하고 필요할 때 정리하기 위해 ~/.bash_profile실행 cl됩니다.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

코드를 실행할 때마다이 작업이 취소되지 않습니까?
Holloway

2
@DoTheEvo : 단순히 생성되지 않으므로 다음에 모듈을로드 할 때 속도가 향상되지 않습니다. 오류가 발생하지 않습니다.
Petr Viktorin

7
이것은 좋은 대답이 아닙니다. 질문자는이 파일의 용도를 알고 싶어합니다. 이 답변은 "걱정하지 마십시오"라고 말한 다음 사라지게합니다.
흥미롭게도

36
절대로 이것을 삭제하는 것을 귀찮게합니다 : 그것은 의미가 없습니다. 파이썬은 행복하게 파일 변경을 감지하지 못하고 많은 상황에서 캐시 파일을 제거하여 "f가 여전히 작동하지 않는 이유, 코드를 변경했습니다. 왜 존재하지 않는 호출에서 여전히 실패합니까?" 특히 테스트 프레임 워크에서는 기본적으로 pycache가 최악입니다.
Mike 'Pomax'Kamermans

2
"이러한 파일을 삭제하지 않아도됩니다"라는 조언에 동의하지 않습니다. 가장 최근에 Kenneth Reitz의 "How To Python" ( "바이트 코드 트릭")에서 권장 한 사항을 여러 번 보았습니다.
Louis Maddox

38

__pycache__당신이 줄을 사용하면 폴더가 생성됩니다 :

import file_name

또는 당신이 만든 다른 파일에서 정보를 얻으려고 노력하십시오. 이렇게하면 다른 파일을 열기 위해 프로그램을 두 번째로 실행할 때 속도가 약간 빨라집니다.


27

3.7 개 이상의 문서에서 업데이트 된 답변 :

모듈 로딩 속도를 높이기 위해 Python__pycache__ 은 name 아래 디렉토리 에 각 모듈의 컴파일 된 버전을 캐시합니다module.version.pyc . 여기서 버전은 컴파일 된 파일의 형식을 인코딩합니다. 일반적으로 파이썬 버전 번호를 포함합니다. 예를 들어 CPython 릴리스 3.3에서 컴파일 된 spam.py 버전은로 캐시됩니다 __pycache__/spam.cpython-33.pyc. 이 명명 규칙을 사용하면 다른 릴리스 및 다른 버전의 Python에서 컴파일 된 모듈이 공존 할 수 있습니다.

출처 : https://docs.python.org/3/tutorial/modules.html#compiled-python-files

즉,이 디렉토리는 Python에 의해 생성되며 프로그램 실행 속도를 높이기 위해 존재합니다. 소스 제어에 전념해서는 안되며 로컬 소스 코드와 공존해야합니다.


__pycache__파이썬에 의해 자동으로 생성되는 바이트 코드 캐시 파일, 즉 컴파일 된 파이썬 또는 파일이 들어있는 디렉토리입니다 .pyc. "해석 된"언어 인 파이썬에 컴파일 된 파일이 왜 있는지 궁금 할 것입니다. 이 SO 질문 은 그 문제를 해결합니다 ( 그리고이 답변을 읽을 가치가 있습니다 ).

파이썬 문서는 정확히 어떻게 작동하고 왜 존재하는지에 대해 더 깊이있게 들어갑니다.

  • .pyc동일한 디렉토리에 파일 을 유지 관리하는 기존 시스템 이 다른 버전의 Python 인터프리터로 프로그램을 실행할 때와 같이 다양한 문제가 발생 했기 때문에 Python 3.2에 추가되었습니다 . 전체 기능 사양은 PEP 3174를 참조하십시오 .

5

공식 파이썬 튜토리얼 모듈에서

모듈 로딩 속도를 높이기 위해 Python __pycache__은 name 아래 디렉토리 에 각 모듈의 컴파일 된 버전을 캐시합니다 module.version.pyc. 여기서 버전은 컴파일 된 파일의 형식을 인코딩합니다. 일반적으로 파이썬 버전 번호를 포함합니다. 예를 들어 CPython 릴리스 3.6에서 컴파일 된 spam.py 버전은로 캐시됩니다 __pycache__/spam.cpython-36.pyc.

파이썬 문서 프로그래밍 FAQ에서

모듈을 처음 가져올 때 (또는 현재 컴파일 된 파일이 작성된 후 소스 파일이 변경된 경우) 컴파일 된 코드를 포함하는 .pyc 파일은 파일을 포함하는 __pycache__디렉토리의 서브 디렉토리에 작성되어야 .py합니다. .pyc파일과 동일한 이름으로 시작하는 파일 이름이됩니다 .py와 파일 및 종료 .pyc를 생성 한 특정 파이썬 바이너리에 따라 중간 구성 요소를.


5

파이썬 스크립트를 실행하면 바이트 코드가 메모리에 생성되어 프로그램이 종료 될 때까지 유지됩니다. 모듈을 가져 오는 경우 더 빠른 재사용 성을 위해 Python은 가져 오는 모듈의 바이트 코드가 캐시되는 캐시 .pyc (PYC는 'Python' 'Compiled') 파일을 생성합니다. 아이디어는 다시 가져올 때 다시 컴파일 (한 번 컴파일, 여러 번 실행 정책)을 피함으로써 파이썬 모듈의 로딩 속도를 높이는 것입니다.

파일 이름은 모듈 이름과 동일합니다. 초기 점 다음 부분은 캐시를 만든 Python 구현 (CPython 일 수 있음)과 버전 번호를 나타냅니다.


3

파이썬 인터프리터는 * .py 스크립트 파일을 컴파일하고 컴파일 결과를 __pycache__디렉토리에 저장합니다 .

프로젝트가 다시 실행될 때 인터프리터가 * .py 스크립트가 수정되지 않았다고 식별하면 컴파일 단계를 건너 뛰고 __pycache__폴더에 저장된 이전에 생성 된 * .pyc 파일을 실행 합니다.

프로젝트가 복잡한 경우 프로젝트를 실행하기 전에 준비 시간을 단축 할 수 있습니다. 프로그램이 너무 작 으면 옵션 python -B abc.py과 함께 사용하여이를 무시할 수 있습니다 B.


3

파이썬 버전 2.x는 인터프리터가 코드를 컴파일 할 때 .pyc 를 갖습니다 .

파이썬 버전 3.x는 인터프리터가 코드를 컴파일 할 때 __pycache__ 를 갖 습니다 .

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

2

3.2 이상에서 Python은 .pyc 컴파일 된 바이트 코드 파일을 __pycache__소스 파일이있는 디렉토리 에있는 하위 디렉토리 에 파일을 생성 한 Python 버전을 식별하는 파일 이름 (예 : script.cpython-33.pyc)으로 저장합니다.


" pycache "폴더 생성을 피하고 모든 .pyc 이름을 .py 파일과 동일하게 지정해야합니까?
Ashwani '12

1

이 때 모듈을 가져 ,

import file_name

파이썬은 컴파일 된 바이트 코드를 __pycache__디렉토리에 저장하여 향후 가져 오기에서 소스를 다시 구문 분석하고 컴파일하지 않고 직접 사용할 수 있습니다.

파일을 가져올 때만 스크립트를 실행하기위한 목적은 아닙니다.

(이전 버전은 캐시 된 바이트 코드를 .py 파일과 같은 디렉토리를 흩 뜨리는 .pyc 파일로 저장하는 데 사용되었지만 Python 3부터는 하위 디렉토리로 이동하여 더 깔끔하게 만들었습니다.)

PYTHONDONTWRITEBYTECODE ---> 이것이 비어 있지 않은 문자열로 설정되면, 파이썬은 소스 모듈을 가져올 때 .pyc 파일을 쓰려고하지 않습니다. -B 옵션을 지정하는 것과 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.