[python] Python 3에서 execfile의 대안은 무엇입니까?

파이썬 3에서는 스크립트를 제거하여 스크립트를 빠르게로드하는 쉬운 방법을 모두 취소 한 것으로 보입니다. execfile()

내가 놓친 명백한 대안이 있습니까?



답변

설명서에 따르면 대신

execfile("./filename") 

사용하다

exec(open("./filename").read())

보다:


답변

파일을 읽고 코드를 직접 실행해야합니다. 2to3 전류 대체

execfile("somefile.py", global_vars, local_vars)

같이

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

(컴파일 호출은 꼭 필요한 것은 아니지만 파일 이름을 코드 객체와 연결하여 디버깅을 좀 더 쉽게 만듭니다.)

보다:


답변

exec(open("filename").read())대한 대안으로 제공되는 경우가 많지만 지원되는 execfile("filename")중요한 세부 정보가 누락되었습니다 execfile.

Python3.x에 대한 다음 함수는 파일을 직접 실행하는 것과 동일한 동작을 수행 할 수있을만큼 가깝습니다. 그것은 running과 일치합니다 python /path/to/somefile.py.

def execfile(filepath, globals=None, locals=None):
    if globals is None:
        globals = {}
    globals.update({
        "__file__": filepath,
        "__name__": "__main__",
    })
    with open(filepath, 'rb') as file:
        exec(compile(file.read(), filepath, 'exec'), globals, locals)

# execute the file
execfile("/path/to/somefile.py")

노트:

  • 인코딩 문제를 피하기 위해 이진 판독 사용
  • 파일을 닫을 수 있습니다 (Python3.x는 이것에 대해 경고합니다)
  • __main__일부 스크립트는 예를 들어 모듈로로드되는지 여부를 확인하기 위해 이것에 의존 합니다 .if __name__ == "__main__"
  • __file__예외 메시지에 대한 설정 이 더 좋으며 일부 스크립트 __file__는 다른 파일의 경로를 가져 오는 데 사용 합니다.
  • 선택적 전역 및 지역 인수를 가져 와서 그대로 수정하여 execfile실행 후 변수를 다시 읽어서 정의 된 모든 변수에 액세스 할 수 있습니다.

  • Python2와 달리 현재 네임 스페이스는 기본적으로 수정 execfile되지 않습니다 . 이를 위해서는 globals()& 를 명시 적으로 전달해야합니다 locals().


답변

최근 python-dev 메일 링리스트 에서 제안한 것처럼 runpy 모듈은 실행 가능한 대안 일 수 있습니다. 그 메시지에서 인용 :

https://docs.python.org/3/library/runpy.html#runpy.run_path

import runpy
file_globals = runpy.run_path("file.py")

다음과 같은 미묘한 차이점이 있습니다 execfile.

  • run_path항상 새로운 네임 스페이스를 만듭니다. 코드를 모듈로 실행하므로 전역과 지역간에 차이가 없으므로 init_globals인수가있는 것입니다. 글로벌이 반환됩니다.

    execfile현재 네임 스페이스 또는 지정된 네임 스페이스에서 실행됩니다. 주어진 경우 locals와 의 의미 globals는 클래스 정의 내부의 지역 및 전역과 유사합니다.

  • run_path 파일뿐만 아니라 계란과 디렉토리도 실행할 수 있습니다 (자세한 내용은 설명서를 참조하십시오).


답변

이 방법은 호출자로부터 글로벌 및 로컬을 가져 오기 때문에 더 좋습니다.

import sys
def execfile(filename, globals=None, locals=None):
    if globals is None:
        globals = sys._getframe(1).f_globals
    if locals is None:
        locals = sys._getframe(1).f_locals
    with open(filename, "r") as fh:
        exec(fh.read()+"\n", globals, locals)


답변

당신은 당신의 자신의 함수를 작성할 수 있습니다 :

def xfile(afile, globalz=None, localz=None):
    with open(afile, "r") as fh:
        exec(fh.read(), globalz, localz)

정말로 필요하다면 …


답변

로드하려는 스크립트가 실행하는 스크립트와 동일한 디렉토리에 있으면 “import”가 작업을 수행합니까?

코드를 동적으로 가져와야하는 경우 내장 함수 __ import__ 와 모듈 imp 를 살펴볼 가치가 있습니다.

>>> import sys
>>> sys.path = ['/path/to/script'] + sys.path
>>> __import__('test')
<module 'test' from '/path/to/script/test.pyc'>
>>> __import__('test').run()
'Hello world!'

test.py :

def run():
        return "Hello world!"

Python 3.1 이상을 사용하는 경우 importlib 도 살펴 봐야 합니다.