런타임에 Python 모듈 버전 확인
많은 타사 Python 모듈에는 모듈에 대한 버전 정보를 포함하는 속성이 있습니다(일반적으로 다음과 같습니다).module.VERSION
또는module.__version__
), 그러나 일부는 그렇지 않습니다.
이러한 모듈의 특정 예로는 libxslt 및 libxml2가 있습니다.
이 모듈들의 올바른 버전이 런타임에 사용되고 있는지 확인해야 합니다.이것을 할 수 있는 방법이 있습니까?
잠재적인 해결책은 런타임에 소스에서 읽고 해시한 다음 알려진 버전의 해시와 비교하는 것이지만, 그것은 끔찍합니다.
더 나은 해결책이 있습니까?
pkg_resources를 사용합니다.PyPI에서 설치된 모든 항목에는 최소한 버전 번호가 있어야 합니다.
>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'
파이썬을 사용 중인 경우>=3.8
이를 위해 기본 제공 라이브러리의 모듈을 사용할 수 있습니다.패키지 버전을 확인하려면 다음과 같이 하십시오(이 예에서는).lxml
) 실행:
>>> from importlib.metadata import version
>>> version('lxml')
'4.3.1'
이 기능은 이전 버전의 파이썬으로 포팅되었습니다.<3.8
또한 별도의 라이브러리를 먼저 설치해야 합니다.
pip install importlib_metadata
그런 다음 패키지 버전을 확인합니다(이 예에서는).lxml
) 실행:
>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'
이것은 PyPI에서 설치된 패키지에만 적용됩니다.또한 패키지 이름을 인수로 전달해야 합니다.version
이 패키지가 제공하는 모듈 이름이 아닌 메서드입니다(일반적으로 동일하지만).
저는 해싱을 멀리할 것입니다.사용 중인 libxslt 버전에 사용자의 사용에 영향을 미치지 않는 패치 유형이 포함되어 있을 수 있습니다.
대안으로 런타임에 확인하지 않는 것이 좋습니다(어려운 요구사항인지 여부는 알 수 없음).외부 종속성이 있는 파이썬 자료(타사 라이브러리)의 경우 사용자가 파이썬 설치를 확인하기 위해 실행할 수 있는 스크립트를 작성하여 적절한 버전의 모듈이 설치되어 있는지 확인합니다.
정의된 'version' 특성이 없는 모듈의 경우, 포함된 인터페이스(클래스 및 메서드)를 검사하고 원하는 인터페이스와 일치하는지 확인할 수 있습니다.그런 다음 작업 중인 실제 코드에서 타사 모듈에 사용자가 예상하는 인터페이스가 있다고 가정합니다.
몇 가지 아이디어:
- 필요한 버전에 존재하거나 존재하지 않는 함수를 확인해 보십시오.
- 함수에 차이가 없으면 함수 인수와 서명을 검사합니다.
- 함수 서명에서 확인할 수 없는 경우 가져오기 시 일부 스텁 호출을 설정하고 해당 동작을 확인합니다.
는 이용 가능한 도구 포함)를할 수 없다는 것을 .pkg_resources
이 다른 답변에 의해 언급됨), 대부분이 모든 사례를 다루지 않기 때문입니다.예를들면
- 내장 모듈
- 모듈이 설치되지 않고 python 경로에 추가되었습니다(예: IDE에 의해).
- 동일한 모듈의 두 가지 버전 사용 가능(파이썬 경로에서 하나는 설치된 버전을 대체함)
패키지, 모듈 또는 서브모듈의 버전을 얻을 수 있는 신뢰할 수 있는 방법이 필요했기 때문에 get version을 작성하게 되었습니다.사용 방법은 매우 간단합니다.
from getversion import get_module_version
import foo
version, details = get_module_version(foo)
자세한 내용은 설명서를 참조하십시오.
사용할 수 있습니다.
pip freeze
설치된 패키지를 요구 사항 형식으로 확인합니다.
를 제공하지 __version__
다음은 못생겼지만 작동합니다.
#!/usr/bin/env python3.6
import sys
import os
import subprocess
import re
sp = subprocess.run(["pip3", "show", "numpy"], stdout=subprocess.PIPE)
ver = sp.stdout.decode('utf-8').strip().split('\n')[1]
res = re.search('^Version:\ (.*)$', ver)
print(res.group(1))
또는
#!/usr/bin/env python3.7
import sys
import os
import subprocess
import re
sp = subprocess.run(["pip3", "show", "numpy"], capture_output=True)
ver = sp.stdout.decode('utf-8').strip().split('\n')[1]
res = re.search('^Version:\ (.*)$', ver)
print(res.group(1))
언급URL : https://stackoverflow.com/questions/710609/checking-a-python-module-version-at-runtime
'source' 카테고리의 다른 글
Oracle SQL Developer 코드 창에서 변수를 사용하여 SQL 코드 실행 (0) | 2023.07.21 |
---|---|
@스프링 부츠스프링 부트가 아닌 응용 프로그램에 대한 테스트 (0) | 2023.07.21 |
열 유형을 지정하는 판다에 빈 데이터 프레임 만들기 (0) | 2023.07.21 |
Spring boot and flyway: 통합 테스트 전에 데이터베이스 데이터 삭제 (0) | 2023.07.21 |
kotlin slf4j를 사용하여 기록하는 가장 좋은 방법 (0) | 2023.07.21 |