IT이야기

임의의 파이썬 소스 파일을 가져옵니다.

cyworld 2021. 10. 16. 10:40
반응형

임의의 파이썬 소스 파일을 가져옵니다. (파이썬 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_spectypes.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

반응형