programing

.pyc 파일을 피하는 방법?

prostudy 2022. 3. 28. 21:41
반응형

.pyc 파일을 피하는 방법?

컴파일된 .pyc 파일을 생성하지 않고 python 통역기를 실행할 수 있는가?

출처: "What's New in Python 2.6 - Intervirator Changes":

이제 Python 통역기에 -B 스위치를 공급하거나, 통역기를 실행하기 전에 PYTONDONDTWRITYCODE 환경 변수를 설정하여 Python이 .pyc 또는 .py표 파일을 쓰는 것을 방지할 수 있다.이 설정은 Python 프로그램에서 변수로 사용할 수 있으며, Python 코드는 값을 변경하여 통역자의 행동을 수정할 수 있다.

2010-11-27 업데이트: Python 3.2는 원본 폴더를 다음 항목으로 복잡하게 만드는 문제를 해결함.pyc특집기사를 도입하여 파일__pycache__하위 폴더는 What's New in Python 3.2 - PYC Repository Directorys를 참조하십시오.

참고: 기본 동작은 바이트 코드를 생성하는 것이며 "성능"을 위해 수행된다(자세한 내용은 python2를 참조하고 python3은 여기를 참조하십시오).

import sys

sys.dont_write_bytecode = True

사실 파이썬 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 또는 .py표 파일을 추가하여 아카이브를 수정하려고 시도하지 않으므로 ZIP 아카이브에 .pyc 파일이 포함되어 있지 않으면 가져오기가 다소 느릴 수 있다.

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

UNIX용으로 제작하는 경우, Unix zip 실행 파일이라는 이 레시피를 사용하여 스크립트를 패키징하는 것도 고려할 수 있지만, stdin을 사용하거나 sys.args의 내용을 읽을 계획이라면 이 방법을 수정해야 할 수도 있다는 점에 유의하십시오.

내 경험상 성능은 이것 때문에 큰 타격을 받지 않지만, 이런 식으로 아주 큰 모듈을 수입하기 전에 다시 한번 생각해봐야 한다.

2.5에서는 사용자가 디렉토리에 대한 쓰기 액세스 권한을 부여하지 않는 것 외에 이를 억제할 방법이 없다.

그러나 python 2.6과 3.0에서는 이를 억제하도록 설정할 수 있는 sys 모듈에서 "dont_write_bytecode"라는 설정이 있을 수 있다.이것은 또한 "-B" 옵션을 통과하거나 환경 변수 "PYTHONDONDONTWRITYCODE"를 설정함으로써 설정할 수 있다.

Python 3.8부터 환경변수를 사용할 수 있다.PYTHONPYCACHEPREFIXPython의 캐시 디렉터리를 정의하십시오.

Python 문서:

만약 이것이 설정된다면, Python은 원본 트리 내의 pycache 디렉토리가 아닌 이 경로의 미러 디렉토리 트리에 .pyc 파일을 쓸 것이다.이는 -X pycache_prefix=PATH 옵션을 지정하는 것과 같다.

예.

에 덧붙이면../profileLinux의 경우:

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

파이톤은 짜증나는 일을 만들지 않을 것이다.__pycache__프로젝트 디렉토리의 디렉토리, 대신 모든 디렉토리, 디렉토리, 디렉토리, 디렉토리~/.cache/cpython/

설정할 수 있다sys.dont_write_bytecode = True네 소스에 있는거지만, 그건 첫번째로 로드된 파이톤 파일에 있을거야.실행하면python somefile.py그러면 너는 얻을 수 없을 것이다.somefile.pyc.

다음을 사용하여 유틸리티를 설치할 때setup.py그리고entry_points=너는 이미 정했을 것이다.sys.dont_write_bytecode시작 스크립트에서.따라서 setuptools에서 생성된 "기본" 시작 스크립트에 의존할 수 없다.

Python 파일을 인수로 사용하여 Python을 시작하는 경우 직접 지정할 수 있음-B:

python -B somefile.py

somefile.pyc어차피 생성되지 않을 것이지만, 그렇지 않다..pyc가져온 다른 파일의 파일.

유틸리티가 있으면myutil그리고 그것을 바꿀 수 없다. 그것은 비단뱀 통역사에게 -B를 전달하지 않을 것이다.환경 변수를 설정하여 시작하십시오.PYTHONDONTWRITEBYTECODE:

PYTHONDONTWRITEBYTECODE=x myutil

테스트 제품군과 Mac 터미널에서 테스트 제품군을 실행하기 전에 다음과 같은 몇 가지 테스트 사례가 있다.

python LoginSuite.py

내 디렉토리가 .pyc 파일로 채워지는 방식으로 명령을 실행했다.나는 아래와 같은 방법을 시도해 보았고, 그것은 그 문제를 해결했다.

python -B LoginSuite.py

이 방법은 테스트 케이스를 테스트 제품군으로 가져오고 명령줄에서 제품군을 실행하는 경우에 사용할 수 있다.

해결 방법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

Python 인터프리터가 실행 중인 사용자를 위해 모듈이 있는 디렉터리를 읽기 전용으로 만들 수 있다.

이보다 더 우아한 선택은 없을 것 같다.PEP 304는 이를 위해 간단한 옵션을 도입하기 위한 시도로 보이지만 포기된 것으로 보인다.

나는 당신이 해결하려고 하는 다른 문제가 있을 것이라고 생각한다. 그 때문에 .py[c]를 비활성화하는 것이 해결책으로 보일 수도 있지만, 대신에 이 원래의 문제가 무엇이든 공격하는 것이 나을 것이다.

내가 아는 한 python은 당신이 "수입"하는 모든 모듈을 컴파일할 것이다.그러나 python은 "filency script.py"을 사용하여 python 스크립트 실행을 컴파일하지 않는다.

진짜 질문은 왜 python이 모듈을 컴파일하지 않길 바라는가?만약 그것들이 방해가 된다면 당신은 아마도 청소하는 방법을 자동화할 수 있을 것이다.

참조URL: https://stackoverflow.com/questions/154443/how-to-avoid-pyc-files

반응형