.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은 여기를 참조하십시오).
- 바이트코드 .pyc 파일의 생성은 캐싱(즉, 평균 성능을 크게 향상)의 한 형태다.
- python 구성
PYTHONDONTWRITEBYTECODE=1
python 성능에 좋지 않을 수 있다(python2는 https://www.python.org/dev/peps/pep-0304/ 참조, python3는 https://www.python.org/dev/peps/pep-3147/ 참조). - 성능에 미치는 영향에 관심이 있으시면 https://github.com/python/cpython 를 참조하십시오.
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부터 환경변수를 사용할 수 있다.PYTHONPYCACHEPREFIX
Python의 캐시 디렉터리를 정의하십시오.
Python 문서:
만약 이것이 설정된다면, Python은 원본 트리 내의 pycache 디렉토리가 아닌 이 경로의 미러 디렉토리 트리에 .pyc 파일을 쓸 것이다.이는 -X pycache_prefix=PATH 옵션을 지정하는 것과 같다.
예.
에 덧붙이면../profile
Linux의 경우:
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
'programing' 카테고리의 다른 글
vue-cli 프로젝트에서 포트 번호를 변경하는 방법 (0) | 2022.03.28 |
---|---|
각도2 - TypeScript : AppComponent에서 시간 초과 후 숫자 증가 (0) | 2022.03.28 |
POST 요청을 보내는 방법? (0) | 2022.03.28 |
useRedcer 및 useContext를 사용하여 사용자 정의 후크에서 작업을 디스패치하는 방법 (0) | 2022.03.28 |
Vuetify : 스로틀/차단 v-autocomplete (0) | 2022.03.28 |