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)
(컴파일 호출이 엄격하게 필요한 것은 아니지만, 파일 이름을 코드 개체와 연결하여 디버깅을 조금 더 쉽게 할 수 있다.)
참조:
- http://docs.python.org/release/2.7.3/library/functions.html#execfile
- http://docs.python.org/release/3.2.3/library/functions.html#compile
- http://docs.python.org/release/3.2.3/library/functions.html#exec
동안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
'Programing' 카테고리의 다른 글
Python에서 XPath를 사용하는 방법? (0) | 2022.03.15 |
---|---|
v-select에서 항목 텍스트 사용자 지정 (0) | 2022.03.15 |
'v-built' 지시어는 어떤 수식어도 지원하지 않는다. (0) | 2022.03.15 |
팬더에서 특정 열 이름 바꾸기 (0) | 2022.03.15 |
Python에서 사전 키를 목록으로 반환하는 방법? (0) | 2022.03.15 |