2008-09-30 6 views

답변

262

를 "-B"옵션을 통과, 또는 설정하여 설정할 수 있습니다

파이썬은 지금 기록 된 .pyc 또는지며 .pyo 파일을 방지 할 수

해석기에 -B 스위치를 제공하거나 인터프리터를 실행하기 전에 PYTHONDONTWRITEBYTECODE 환경 변수를 으로 설정하면됩니다. 이 설정은 파이썬 프로그램에 sys.dont_write_bytecode 변수로 사용할 수 있으며 파이썬 코드는 값을 으로 변경하여 인터프리터의 동작을 수정할 수 있습니다.

업데이트 2010-11-27 : 파이썬 3.2 주소 특별한 __pycache__ 하위 폴더를 도입하여 .pyc 파일과 소스 폴더를 어지럽히고의 문제, What's New in Python 3.2 - PYC Repository Directories를 참조하십시오.

+1

적어도 OS X 10.8에서 Python 2.7을 실행하면 환경 변수가 영향을 미치지 않습니다. – sorin

+2

(C++ 프로그램에서) 인터프리터를 임베드하는 경우 "Py_DontWriteBytecodeFlag = 1;"을 사용하십시오. 귀하의 소스 코드에.이것은 pydebug.h에 선언 된 전역적인 int입니다. – JimB

+2

그래, 이건 절대 작동하지 않습니다. – tar

1

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

진짜 질문은 파이썬이 모듈을 컴파일하지 않기를 바라는 이유입니다. 그들이 방해가되면 청소 방법을 자동화 할 수 있습니다.

+0

내가 자주 발견에 다음과 같은 사용. 어떤 이유로 클래스/모듈을 변경할 때'.pyc' 파일이 업데이트되지 않습니다. 따라서'.py' 파일을 변경 한 후에 가져올 때 여전히'.pyc' 파일을 사용하여 오류가 발생합니다 –

1

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

나는 더 우아한 옵션이 있다고 생각하지 않습니다. PEP 304은 간단한 옵션을 도입하려는 시도 인 것처럼 보였지만 버려진 것 같습니다.

당신이 해결하려고하는 다른 문제가 있다고 생각합니다.이 문제를 해결하려면 .py [co]가 해결 방법 인 것처럼 보이지만, 원래 문제가 무엇이든간에 공격하는 것이 좋습니다.

9

2.5에서는 사용자가 디렉토리에 대한 쓰기 권한을 부여하지 않는 등의 조치 이외에는 아무 것도 표시하지 않습니다.

그러나 파이썬 2.6 및 3.0에서는 "dont_write_bytecode"라는 sys 모듈의 설정이있을 수 있습니다.이 설정은 이것을 억제하도록 설정할 수 있습니다. 이것은 또한 "What’s New in Python 2.6 - Interpreter Changes"에서 환경 변수 "PYTHONDONTWRITEBYTECODE"

22

실제로 파이썬 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 파일이 포함되어 있지 않으면 가져 오기가 다소 느릴 수 있습니다.

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

UNIX 용으로 작성하는 경우이 처방을 사용하여 스크립트를 패키징하는 것을 고려해보십시오. unix zip executable, stdin을 사용하거나 sys.args에서 아무것도 읽지 않으려 고하면이 스크립트를 조정해야 할 수도 있습니다 너무 많은 문제없이 CAN을 수행 할 수 있습니다.)

내 경험으로 보면 성능이 너무 좋아졌지만 이렇게 큰 모듈을 가져 오기 전에 두 번 생각해야합니다.

91
import sys 

sys.dont_write_bytecode = True 
+8

가져온 모듈에 대해서는 작동하지 않습니다. –

+22

방금 ​​시도했지만 가져온 모듈에서 작동합니다. 특히이 변수가 설정되면 나중에 가져온 항목은 pyc 파일을 생성하지 않습니다. 이것은 즐겁습니다. 감사. –

+0

부모 모듈에 추가하기보다는 참조 된 스크립트에 추가하십시오. 멋지다. @te wilson 덕분에 – Sathy

2

나는 테스트 스위트에서 몇 가지 테스트 케이스를 가지고 있고이 같은 맥 터미널에서 테스트 스위트 실행하기 전에 : 명령이 방법을 실행

python LoginSuite.py 

을 내 디렉토리가 채워지했다 .pyc 파일. 나는 아래 명시된 방법을 시도하고이 문제를 해결 : 당신은 테스트 스위트에 테스트 케이스를 가져 오기 및 명령 줄에서 제품군을 실행하는 경우

python -B LoginSuite.py 

이 방법은 작동합니다.

6

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

setup.pyentry_points=을 사용하여 유틸리티를 설치하면 시작 스크립트에 sys.dont_write_bytecode이 설정됩니다. 따라서 setuptools에 의해 생성 된 "기본"시작 스크립트에 의존 할 수 없습니다.

python -B somefile.py 

somefile.pyc

어쨌든 생성되지 것이지만, 다른 파일에 대한 .pyc 파일도 가져 오지 : 당신이 인수 자신을 파이썬 파일을 파이썬을 시작하면

당신은 -B를 지정할 수 있습니다.

일부 유틸리티 myutil이 있는데 변경할 수 없다면 파이썬 인터프리터에 -B가 전달되지 않습니다. 그냥 환경 변수 PYTHONDONTWRITEBYTECODE를 설정하여 시작합니다

PYTHONDONTWRITEBYTECODE=x myutil 
0

(우분투 16.04 및 Windows 10에서 테스트) ipython 6.2.1 using python 3.5.2에 대한 해결책 : ipython 통역원으로 또는 시작시 설정 한 경우 %env PYTHONDONTWRITEBYTECODE =1을 존중하지 않는

Ipython~/.ipython/profile-default/startup/00-startup.ipy. 대신이`오래된 바이트 코드 파일 만 .pyc`하는 당신의 ~.ipython/profile-default/startup/00-startup.py

import sys 
Sys.dont_write_bytecode=True 
관련 문제