임의의 파이썬 소스 파일을 가져옵니다. (파이썬 3.3 이상)
Python 3.3+.py
에서 임의의 Python 소스 파일(파일 이름에 모든 문자가 포함될 수 있고 항상 로 끝나지 않음 )을 가져오려면 어떻게 해야 합니까?
나는 imp.load_module
다음과 같이 사용 했다:
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
여전히 Python 3.3에서 작동하지만 imp.load_module
문서 에 따르면 더 이상 사용되지 않습니다.
버전 3.3부터 사용되지 않음 : 로더를 사용하여 모듈을 로드해야 하고 find_module()이 사용되지 않으므로 필요하지 않습니다.
및 imp
모듈 문서는 다음을 사용하도록 권장합니다 importlib
.
참고 새 프로그램은 이 모듈 대신 importlib를 사용해야 합니다.
더 이상 사용되지 않는 imp.load_module
함수 를 사용하지 않고 Python 3.3 이상에서 임의의 Python 소스 파일을 로드하는 적절한 방법은 무엇입니까 ?
importlib
테스트 코드 에서 솔루션을 찾았습니다 .
importlib.machinery.SourceFileLoader 사용 :
>>> import importlib.machinery
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> mod = loader.load_module()
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
참고 : Python 3.3+ 에서만 작동합니다 .
UPDATE Loader.load_module
는 Python 3.4부터 더 이상 사용되지 않습니다. 사용 Loader.exec_module
하는 대신 :
>>> import types
>>> import importlib.machinery
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> mod = types.ModuleType(loader.name)
>>> loader.exec_module(mod)
>>> mod
<module 'a_b'>
>>> import importlib.machinery
>>> import importlib.util
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> spec = importlib.util.spec_from_loader(loader.name, loader)
>>> mod = importlib.util.module_from_spec(spec)
>>> loader.exec_module(mod)
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
@falsetru 솔루션의 짧은 버전:
>>> import importlib.util
>>> spec = importlib.util.spec_from_file_location('a_b', '/tmp/a-b.py')
>>> mod = importlib.util.module_from_spec(spec)
>>> spec.loader.exec_module(mod)
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
Python 3.5 및 3.6으로 테스트했습니다.
의견에 따르면 임의의 파일 확장자와는 작동하지 않습니다.
@falsetru와 유사하지만 Python 3.5+ 및 over 사용에 대한 importlib
문서의 설명 :importlib.util.module_from_spec
types.ModuleType
이 함수 [
importlib.util.module_from_spec
]는types.ModuleType
모듈에서 가능한 한 많은 가져오기 제어 속성을 설정하는 데 사양이 사용되므로 새 모듈을 만드는 데 사용하는 것보다 선호 됩니다.
We are able to import any file with importlib
alone by modifying the importlib.machinery.SOURCE_SUFFIXES
list.
import importlib
importlib.machinery.SOURCE_SUFFIXES.append('') # empty string to allow any file
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# if desired: importlib.machinery.SOURCE_SUFFIXES.pop()
ReferenceURL : https://stackoverflow.com/questions/19009932/import-arbitrary-python-source-file-python-3-3
'IT이야기' 카테고리의 다른 글
AngularJS 컨트롤러에서 현재 범위 dom-element를 얻으려면 (0) | 2021.10.16 |
---|---|
Composer 패키지를 개발하고 포함하는 방법 (0) | 2021.10.16 |
AF네트워킹 및 백그라운드 전송 (0) | 2021.10.16 |
Sklearn, gridsearch: 실행 중 진행 상황을 인쇄하는 방법 (0) | 2021.10.15 |
갤러리에서 이미지를 가져오는 Android가 회전합니다. (0) | 2021.10.15 |