Programing

Python 3에서 execile의 대안은 무엇인가?

c10106 2022. 3. 15. 20:30
반응형

Python 3에서 execile의 대안은 무엇인가?

Python 3에서는 스크립트를 제거하여 쉽게 로드할 수 있도록 모두 취소한 것 같다.execfile()

내가 놓치고 있는 확실한 대안이 있을까?

설명서에 따르면, 다음이 아닌

execfile("./filename") 

사용하다

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

참조:

그냥 파일을 읽고 직접 코드를 실행하면 된다.2대3 전류 교체

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지지의

파이톤3.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__다른 파일들의 경로를 얻는 것.

  • 선택적 글로벌 및 로컬 인수를 사용하여 내부 수정(in-place) 인수를 다음과 같이 수정execfile- - 실행 후 수 수 수 수 수 수 수 어 어 어 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수 수

  • 파이썬2와는 달리execfile이것은 기본적으로 현재 네임스페이스를 수정하지 않는다.그러기 위해서는 명시적으로 합격해야 한다.globals()&locals().

최근 파이썬-데브 메일링리스트에서 제시된 바와 같이, 런피 모듈이 실행 가능한 대안일 수도 있다.이 메시지에서 인용:

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

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

에 미묘한 차이가 있다execfile:

  • run_path항상 새로운 네임스페이스를 생성한다.모듈로서 코드를 실행하기 때문에 글로발과 현지인 사이에는 차이가 없다(이 때문에 단지 a)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_와 모듈 imf를 동적으로 불러와야 한다면 눈여겨볼 만하다.

>>> 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 이상을 사용하고 있다면 invoclib도 살펴봐야 한다.

여기 내가 먹었던 것이 있다.file두 가지 예에서 모두 소스 코드가 있는 파일의 경로에 이미 할당됨:

execfile(file)

다음으로 교체한 내용은 다음과 같다.

exec(compile(open(file).read(), file, 'exec'))

내가 가장 좋아하는 부분: 두 번째 버전은 Python 2와 3 둘 다 잘 작동하는데, 이것은 버전 의존 논리에 추가할 필요가 없다는 것을 의미한다.

피하다exec()네가 할 수 있으면.대부분의 어플리케이션에서는 파이썬의 수입 시스템을 사용하는 것이 더 깨끗하다.

이 기능은 빌트인을 사용하여 파일을 실제 모듈로 실행한다.

from importlib import util

def load_file_as_module(name, location):
    spec = util.spec_from_file_location(name, location)
    module = util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

사용 예제

파일 하나 갖자.foo.py:

def hello():
    return 'hi from module!'
print('imported from', __file__, 'as', __name__)

일반 모듈로 가져오십시오.

>>> mod = load_file_as_module('mymodule', './foo.py')
imported from /tmp/foo.py as mymodule
>>> mod.hello()
hi from module!
>>> type(mod)
<class 'module'>

이점

이 방법은 네임스페이스를 오염시키거나 당신의 이름을 더럽히지 않는다.$PATH반면에exec()현재 기능의 컨텍스트에서 직접 코드를 실행하여 이름 충돌을 유발할 수 있음.또한 모듈 속성은 다음과 같다.__file__그리고__name__올바르게 설정되고 코드 위치가 보존된다.따라서 디버거를 연결했거나 모듈이 예외를 제기할 경우 사용 가능한 트레이스백(Traceback)을 받게 된다.

정적 가져오기와의 사소한 차이점은 실행될 때마다 모듈을 가져오기(실행)한다는 점에 유의하십시오.load_file_as_module(), 그리고 단 한 번이 아니다.import키워드

위의 패턴은 ASCII 또는 utf-8이 아닌 PEP-263 인코딩 선언을 사용하는 경우 실패한다는 점에 유의하십시오.데이터의 인코딩을 찾아서 실행()에게 전달하기 전에 올바르게 인코딩해야 한다.

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'이 정의되지 않음"이라는 메시지가 표시됨. 매우 기초적인 작업을 시도했음

    import filename

잘 됐다 :-)

나는 이것이 도움이 될 수 있기를 바라며, 새로운 사람들에게 큰 영감을 주는 훌륭한 힌트, 예시, 그리고 훌륭하게 논평된 모든 코드 조각들에 대해 여러분 모두에게 감사한다!

나는 Ubuntu 16.014 LTS x64를 사용한다.Python 3.5.2 (기본값, 2016년 11월 17일, 17:05:23) [Linux의 GCC 5.4.0 20160609]

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

반응형