Programing

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

lottogame 2020. 3. 10. 08:19
반응형

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 도 살펴 봐야 합니다.


여기 내가 가진 것이 있습니다 ( 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)

또한 순수한 Python 솔루션은 아니지만 IPython을 사용하는 경우 (아마도), 다음을 수행 할 수 있습니다.

%run /path/to/filename.py

똑같이 쉽습니다.


나는 여기에 초보자 일뿐이므로 이것을 발견하면 순수한 행운 일 것입니다.

인터프리터 프롬프트 >>> 명령을 사용하여 스크립트를 실행 한 후

    execfile('filename.py')

"NameError : name 'execfile'is not defined"에 대해 매우 기본적인 것을 시도했습니다.

    import filename

그것은 잘 작동했습니다 :-)

나는 이것이 도움이되기를 바랍니다. 훌륭한 힌트, 예제 및 새로 등장한 사람들에게 큰 영감을주는 모든 코드 주석에 대해 감사합니다!

우분투 16.014 LTS x64를 사용합니다. Python 3.5.2 (디폴트, 2016 년 11 월 17 일 17:05:23) [GCC 5.4.0 20160609] Linux

참고 URL : https://stackoverflow.com/questions/436198/what-is-an-alternative-to-execfile-in-python-3

반응형