문제

Python 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에 대한 다음 기능은 파일을 직접 실행하는 것과 동일한 동작을 가질 수있는만큼 가깝습니다. 그것은 달리기와 일치합니다 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top