.pyc 파일을 피하는 방법?


268

컴파일 된 .pyc 파일을 생성하지 않고 파이썬 인터프리터를 실행할 수 있습니까?

답변:


288

에서 "파이썬 2.6의 새로운 기능 - 통역 변경" :

Python은 이제 -B 스위치를 Python 인터프리터에 제공하거나 인터프리터 를 실행하기 전에 PYTHONDONTWRITEBYTECODE 환경 변수를 설정하여 .pyc 또는 .pyo 파일을 쓰지 못하게 할 수 있습니다 . 이 설정은 Python 프로그램에서 sys.dont_write_bytecode변수 로 사용할 수 있으며 Python 코드는 값을 변경하여 인터프리터의 동작을 수정할 수 있습니다.

업데이트 2010-11-27 : Python 3.2 .pyc는 특수 __pycache__하위 폴더 를 도입하여 파일로 소스 폴더를 복잡하게 만드는 문제를 해결합니다 . Python 3.2-PYC 리포지토리 디렉토리의 새로운 기능을 참조하십시오 .


1
Python 2.7을 실행하는 OS X 10.8 이상에서는 환경 변수가 적용되지 않습니다.
sorin

5
인터프리터 (C ++ 프로그램)를 임베드하는 경우 "Py_DontWriteBytecodeFlag = 1;" 소스 코드에서. 그것은 pydebug.h에 선언 된 전역 int입니다.
JimB

1
환경 변수는 2.7에서 나에게 잘 작동하지만 다른 사람들이 어떤 문제를 겪고 있는지 모르겠습니다. 감사!
토마스

8
OSX (10.8 & 10.10)에서도 저를 위해 일했습니다. @sorin 변수를 올바르게 내보냈습니까? export PYTHONDONTWRITEBYTECODE=1
nevelis

1
pytest와 동일한 작업을 수행하는 방법을 알고 있습니까?

110
import sys

sys.dont_write_bytecode = True

25
방금 시도한 결과 가져온 모듈에서 작동합니다. 특히,이 변수가 설정되면 나중에 가져온 것은 pyc 파일을 생성하지 않습니다. 유쾌합니다. 감사.

부모 모듈에서 이것을 추가하는 대신, 참조 된 스크립트에서 이것을 추가하십시오. 이것은 시원합니다. @te wilson에게 감사드립니다
Sathy

4
이것을 site-packages/usercustomize.py모든 스크립트에 적용하려면 이것을 추가하십시오 . 나를 위해,이 디렉토리는 $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py입니다. Cf. docs.python.org/2/tutorial/…
RobM

3
내 사이트 패키지에 위치했다 : /usr/local/lib/python2.7/site-packages 나는 usercustomize.py 만들어야했습니다
anon58192932

3
또는 한 줄로 :import sys; sys.dont_write_bytecode = True
ET-CS

23

실제로 파이썬 2.3 이상에서 그것을 할 수있는 방법이 있지만 약간 난해합니다. 이것을 알고 있는지 모르겠지만 다음을 수행 할 수 있습니다.

$ unzip -l /tmp/example.zip
 Archive:  /tmp/example.zip
   Length     Date   Time    Name
 --------    ----   ----    ----
     8467  11-26-02 22:30   jwzthreading.py
 --------                   -------
     8467                   1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32) 
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip')  # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'

zipimport 라이브러리 에 따르면 :

ZIP 아카이브에는 모든 파일이있을 수 있지만 .py 및 .py [co] 파일 만 가져올 수 있습니다. 동적 모듈 (.pyd, .so)의 ZIP 가져 오기는 허용되지 않습니다. 아카이브에 .py 파일 만 포함 된 경우 Python은 해당 .pyc 또는 .pyo 파일을 추가하여 아카이브를 수정하려고 시도하지 않습니다. 즉, ZIP 아카이브에 .pyc 파일이 없으면 가져 오기 속도가 느려질 수 있습니다.

따라서 파일을 압축하고 zip 파일을 sys.path에 추가 한 다음 가져 오기만하면됩니다.

유닉스 용으로 빌드한다면, unix zip executable 레시피를 사용하여 스크립트 패키징을 고려할 수도 있지만 stdin을 사용하거나 sys.args에서 무엇이든 읽을 계획이라면 이것을 조정해야 할 수도 있습니다. 너무 많은 어려움없이 수행).

내 경험상 성능으로 인해 많은 어려움을 겪지 않지만 이렇게 큰 모듈을 가져 오기 전에 두 번 생각해야합니다.


11

2.5에서는 사용자에게 디렉토리에 대한 쓰기 권한을 부여하지 않는 등의 조치 외에는이를 억제 할 방법이 없습니다.

그러나 파이썬 2.6 및 3.0에서는 sys 모듈에 "dont_write_bytecode"라는 설정이있을 수 있으며이를 억제하도록 설정할 수 있습니다. "-B"옵션을 전달하거나 환경 변수 "PYTHONDONTWRITEBYTECODE"를 설정하여 설정할 수도 있습니다.


7

sys.dont_write_bytecode = True소스에서 설정할 수 있지만로드 된 첫 번째 파이썬 파일에 있어야합니다. 당신이 실행 python somefile.py하면 얻을 수 없습니다 somefile.pyc.

당신이 사용하는 유틸리티를 설치할 때 setup.pyentry_points=당신은 설정 한 것입니다 sys.dont_write_bytecode시작 스크립트에서. 따라서 setuptools에서 생성 한 "기본"시작 스크립트에 의존 할 수 없습니다.

파이썬 파일을 인자로 파이썬을 시작하면 다음을 지정할 수 있습니다 -B.

python -B somefile.py

somefile.pyc어쨌든 생성되지 않지만 .pyc다른 파일의 파일도 가져 오지 않습니다 .

유틸리티가 myutil있고 변경할 수 없으면 -B를 파이썬 인터프리터로 전달하지 않습니다. 환경 변수를 설정하여 시작하십시오 PYTHONDONTWRITEBYTECODE.

PYTHONDONTWRITEBYTECODE=x myutil

4

테스트 스위트에 여러 테스트 사례가 있으며 Mac 터미널에서 테스트 스위트를 실행하기 전에 다음과 같이하십시오.

python LoginSuite.py

이 방법으로 명령을 실행하면 내 디렉토리에 .pyc 파일이 채워집니다. 아래 명시된 방법을 시도하고 문제를 해결했습니다.

python -B LoginSuite.py

이 방법은 테스트 사례를 테스트 스위트로 가져오고 명령 행에서 스위트를 실행하는 경우 작동합니다.


4

Python 3.8 부터 환경 변수 PYTHONPYCACHEPREFIX를 사용하여 Python의 캐시 디렉토리를 정의 할 수 있습니다 .

파이썬 문서에서 :

이것이 설정되면, 파이썬은 소스 트리 내의 pycache 디렉토리 대신이 경로의 미러 디렉토리 트리에 .pyc 파일을 작성합니다 . 이것은 -X pycache_prefix = PATH 옵션을 지정하는 것과 같습니다.

./profileLinux에서 다음 줄을 추가하면 :

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

파이썬은 __pycache__프로젝트 디렉토리에 성가신 디렉토리를 만들지 않고 대신 모든 디렉토리를 배치합니다~/.cache/cpython/


2

파이썬 인터프리터가 실행되는 사용자를 위해 모듈이 존재하는 디렉토리를 읽기 전용으로 만들 수 있습니다.

더 우아한 옵션이 없다고 생각합니다. PEP 304 는이를위한 간단한 옵션을 도입하려는 시도 인 것으로 보이지만 포기 된 것으로 보입니다.

해결하려는 다른 문제가 있다고 생각합니다.


2

ipython 6.2.1 using python 3.5.2(Ubuntu 16.04 및 Windows 10에서 테스트)에 대한 솔루션 :

Ipython인터프리터 %env PYTHONDONTWRITEBYTECODE =1에서 설정 ipython하거나에서 시작하는 동안 존중하지 않습니다 ~/.ipython/profile-default/startup/00-startup.ipy. 대신에 다음을 사용하십시오.~.ipython/profile-default/startup/00-startup.py

import sys
sys.dont_write_bytecode=True

0

내가 아는 한 파이썬은 "가져온"모든 모듈을 컴파일 할 것이다. 그러나 python은 "python script.py"를 사용하여 python 스크립트 실행을 컴파일하지 않습니다 (그러나 스크립트가 가져 오는 모든 모듈을 컴파일합니다).

실제 질문은 파이썬이 모듈을 컴파일하지 않기를 원하는 이유입니다. 방해가되는 경우 이러한 청소 방법을 자동화 할 수 있습니다.


오래된 바이트 코드 .pyc파일 이 있다는 것을 자주 발견했습니다 . 어떤 이유로 클래스 / 모듈을 변경하면 .pyc파일이 업데이트되지 않습니다. 따라서 .py파일 을 변경 한 후 가져 오면 파일을 계속 사용하여 .pyc오류가 발생합니다
alpha_989
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.