Python이 .py 파일을 찾지 못하게 하는 방법

Python이 .py 파일을 찾지 못하게 하는 방법

리소스가 거의 없는 시스템(내장형)이 있습니다. 따라서 내 프로그램에는 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 파일이 있으면 작동합니다.

관련 정보