스택큐힙리스트

Python에서 버전 번호를 어떻게 비교할 수 있나요? 본문

카테고리 없음

Python에서 버전 번호를 어떻게 비교할 수 있나요?

스택큐힙리스트 2023. 4. 12. 20:14
반응형

나는 알이 들어있는 디렉토리를 탐색하여 그 알들을 sys.path에 추가하고자 합니다. 만약 디렉토리에 같은 .egg 파일의 두 버전이 있다면, 최신 버전만 추가하고 싶습니다.

파일 이름에서 이름과 버전을 추출하기 위해 정규표현식 r^(?P\w+)-(?P[\d\.]+)-.+\.egg$을 사용합니다. 문제는 버전 번호인 2.3.1와 같은 문자열을 비교하는 것입니다.

문자열을 비교하고 있기 때문에 10보다 높은 2개의 정렬이 있지만, 버전에 대해서는 올바르지 않습니다.

>>> 2.3.1 > 10.1.1

True

분할, 구문 분석, int로 캐스팅 등을 할 수 있겠지만 결국 해결책을 얻을 수 있을 것입니다. 그러나 이것은 Python입니다. not Java. 버전 문자열을 비교하는 우아한 방법이 있을까요?

답변 1

packaging.version.parse 를 사용하십시오.

>>> # pip install packaging

>>> from packaging import version

>>> version.parse(2.3.1) < version.parse(10.1.2)

True

>>> version.parse(1.3.a4) < version.parse(10.1.2)

True

>>> isinstance(version.parse(1.3.a4), version.Version)

True

>>> isinstance(version.parse(1.3.xy123), version.LegacyVersion)

True

>>> version.Version(1.3.xy123)

Traceback (most recent call last):

...

packaging.version.InvalidVersion: Invalid version: '1.3.xy123'

packaging.version.parse는 제3자 유틸리티이지만 setuptools가 사용하기 때문에 (이미 설치되어 있을 가능성이 높음) 현재 PEP 440에 준수하며, 버전이 준수되면 packaging.version.Version를 반환하고 그렇지 않으면 packaging.version.LegacyVersion를 반환합니다. 후자는 항상 유효한 버전보다 우선하여 정렬됩니다.

참고 : 포장은 최근에 vendored into setuptools되었습니다.

당신이 마주칠 수 있는 고대의 $$$ 방법은 $$$이며, 이는 문서화되어 있지 않으며 과거의 $$$에만 따라합니다.

>>> from distutils.version import LooseVersion, StrictVersion

>>> LooseVersion(2.3.1) < LooseVersion(10.1.2)

True

>>> StrictVersion(2.3.1) < StrictVersion(10.1.2)

True

>>> StrictVersion(1.3.a4)

Traceback (most recent call last):

...

ValueError: invalid version number '1.3.a4'

당신이 볼 수 있듯이, 이는 유효한 PEP 440 버전을 엄격하지 않다고 인식하므로 모던 파이썬에서 유효한 버전의 개념과 일치하지 않습니다.

distutils.version는 문서화되어 있지 않으므로, here가 관련된 독스트링(docstring)입니다.

답변 2

파이썬에서 버전 번호를 비교하는 방법은 비교 연산자를 사용하는 것입니다. 버전 번호는 대개 세 부분으로 구성되어 있으므로, 각 부분을 정수로 변환한 다음 비교하면 됩니다.

다음은 두 버전 번호를 비교하는 샘플 코드입니다.

```python

version1 = '1.2.3'

version2 = '1.2.4'

def compare_versions(version1, version2):

v1_parts = version1.split('.')

v2_parts = version2.split('.')

max_length = max(len(v1_parts), len(v2_parts))

for i in range(max_length):

v1_part = int(v1_parts[i] if i < len(v1_parts) else 0)

v2_part = int(v2_parts[i] if i < len(v2_parts) else 0)

if v1_part < v2_part:

return -1

elif v1_part > v2_part:

return 1

return 0

print(compare_versions(version1, version2))

```

이 코드는 version1과 version2를 비교하여 version1이 version2보다 낮으면 -1을, 높으면 1을, 같으면 0을 반환합니다. 이 코드를 실행하면, version1이 version2보다 하나 작으므로 -1을 반환합니다.

파이썬에서 버전 번호를 비교하는 방법은 간단합니다. 정수로 변환한 다음 비교 연산자를 사용하면 됩니다. 이를 이용해서 프로그래밍을 할 때는 코드의 가독성과 확장 가능성을 고려하여 구현해야 합니다.

반응형
Comments