Python 3에서 Execfile의 대안은 무엇입니까?
-
22-07-2019 - |
문제
Python 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에 대한 다음 기능은 파일을 직접 실행하는 것과 동일한 동작을 가질 수있는만큼 가깝습니다. 그것은 달리기와 일치합니다 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에 제안되었습니다 Mailinglist 최근에 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 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.
여기에 내가 가진 것이 있습니다.file
두 예제에서 소스 코드가있는 파일 경로에 이미 할당되었습니다.
execfile(file)
다음은 다음과 같이 대체했습니다.
exec(compile(open(file).read(), file, 'exec'))
내가 가장 좋아하는 부분 : 두 번째 버전은 Python 2와 3에서 잘 작동하므로 버전 종속 로직을 추가 할 필요가 없습니다.
ASCII 또는 UTF-8이 아닌 PEP-263 인코딩 선언을 사용하는 경우 위의 패턴이 실패합니다. 데이터 인코딩을 찾아서 exec ()에 전달하기 전에 데이터를 올바르게 인코딩해야합니다.
class python3Execfile(object):
def _get_file_encoding(self, filename):
with open(filename, 'rb') as fp:
try:
return tokenize.detect_encoding(fp.readline)[0]
except SyntaxError:
return "utf-8"
def my_execfile(filename):
globals['__file__'] = filename
with open(filename, 'r', encoding=self._get_file_encoding(filename)) as fp:
contents = fp.read()
if not contents.endswith("\n"):
# http://bugs.python.org/issue10204
contents += "\n"
exec(contents, globals, globals)
또한 순수한 파이썬 솔루션은 아니지만 ipython을 사용하는 경우 (어쨌든해야 할 것과 같이) 할 수 있습니다.
%run /path/to/filename.py
똑같이 쉽습니다.
나는 여기에 초보자 일 것입니다. 아마도 이것을 찾으면 순수한 행운 일 것입니다.
통역사 프롬프트에서 스크립트를 실행하려고 시도한 후 >>> 명령으로
execfile('filename.py')
"Nameerror : Name 'execfile'이 정의되지 않았습니다."나는 매우 기본적으로 시도했습니다.
import filename
잘 작동했습니다 :-)
나는 이것이 도움이 될 수 있기를 바랍니다. 위대한 힌트, 예제 및 신규 이민자들에게 큰 영감을주는 모든 댓글을 달린 코드에 대해 감사드립니다!
우분투 16.014 LTS X64를 사용합니다. Python 3.5.2 (기본값, 2016 년 11 월 17 일, 17:05:23) [GCC 5.4.0 20160609] Linux