리소스가 거의 없는 시스템(내장형)이 있습니다. 따라서 내 프로그램에는 Python .pyo 파일(=바이트 컴파일 및 최적화)만 설치했습니다. 이제 이와 같은 프로그램이 실행되면 Python은 지속적으로 .py 파일을 찾습니다(아마도 .pyo를 업데이트해야 하는지 확인하기 위해). 흥미롭게도 5분 만에 25000번의 stat64() 호출(및 8304번의 getcwd() 호출)을 수행했습니다.
getcwd("/tmp", 1026) = 9
getcwd("/tmp", 1026) = 9
stat64("MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python25.zip/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/plat-linux2/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/lib-tk/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/python2.5/lib-dynload/MyProgram.py", 0xbeb94b0c) = -1 ENOENT (No such file or directory)
stat64("MyProgram.py", 0xbeb94cc8) = -1 ENOENT (No such file or directory)
getcwd("/tmp", 1026) = 9
stat64("MyProgram.py", 0xbeb94bc4) = -1 ENOENT (No such file or directory)
파이썬이 이런 일을 하는 것을 어떻게 막을 수 있나요?
답변1
당신은 교체를 시도할 수 있습니다__builtins__.__import__
함수(import 문에 의해 호출됨)를 자신의 코드로 사용하세요. 당신은 그것을 사용할 수 있습니다imp.load_module
함수는 py/pyc/pyo 파일을 로드합니다.
매우 간단한 버전은 다음과 같습니다.
import sys
import imp
real_import = __builtins__.__import__
def pyc_only_import(name, globals = globals(), locals = locals(), fromlist = [], level = 0):
pycname = name + ".pyc"
modfile = open(pycname)
return imp.load_module(name, modfile, pycname, (".pyc", "rb", 2))
__builtins__.__import__ = pyc_only_import
import hello
완전히 구현되지는 않았지만 __import__
현재 작업 디렉터리에 hello.pyc 파일이 있으면 작동합니다.