source

런타임에 Python 모듈 버전 확인

ittop 2023. 7. 21. 21:56
반응형

런타임에 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' 특성이 없는 모듈의 경우, 포함된 인터페이스(클래스 및 메서드)를 검사하고 원하는 인터페이스와 일치하는지 확인할 수 있습니다.그런 다음 작업 중인 실제 코드에서 타사 모듈에 사용자가 예상하는 인터페이스가 있다고 가정합니다.

몇 가지 아이디어:

  1. 필요한 버전에 존재하거나 존재하지 않는 함수를 확인해 보십시오.
  2. 함수에 차이가 없으면 함수 인수와 서명을 검사합니다.
  3. 함수 서명에서 확인할 수 없는 경우 가져오기 시 일부 스텁 호출을 설정하고 해당 동작을 확인합니다.

는 이용 가능한 도구 포함)를할 수 없다는 것을 .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

반응형