[python] Python 3에서 execfile의 대안은 무엇입니까?
파이썬 3에서는 스크립트를 제거하여 스크립트를 빠르게로드하는 쉬운 방법을 모두 취소 한 것으로 보입니다. execfile()
내가 놓친 명백한 대안이 있습니까?
답변
답변
파일을 읽고 코드를 직접 실행해야합니다. 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 도 살펴 봐야 합니다.