스크립트를 해석하는 Python 인터프리터의 버전을 어떻게 확인할 수 있습니까?
python_version = int(str(range(3))[-2])
스크립트를 해석하는 Python 인터프리터의 버전을 어떻게 확인할 수 있습니까?
python_version = int(str(range(3))[-2])
답변:
이 정보는 sys 모듈 의 sys.version 문자열에서 사용할 수 있습니다 .
>>> import sys
인간이 읽을 수있는 내용 :
>>> print(sys.version) # parentheses necessary in python 3.
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
추가 처리 :
>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
Python 인터프리터의 최소 버전 요구 사항으로 스크립트를 실행하려면 코드에 다음을 추가하십시오.
assert sys.version_info >= (2, 5)
주요 및 부 버전 정보를 비교합니다. (= 마이크로 추가 0
, 1
등), 심지어 releaselevel (= 'alpha'
, 'final'
당신 등과 같은 튜플, 등). 그러나 특정 기능이 있는지 확인하고 그렇지 않은 경우 해결 방법 (또는 구제)을 확인하는 것이 "항상 덕"하는 것이 좋습니다. 때로는 기능이 최신 릴리스에서 사라져 다른 버전으로 대체 될 수 있습니다.
PY3 = sys.version_info[0] == 3
sys.version_info
속성으로 일부 필드에 액세스 할 수도 있으므로 PY3 = sys.version_info.major == 3
조금 더 매력적일 수 있습니다.
if sys.version_info >= (3,)
합니다. 서로 다른 크기의 튜플을 비교하는 것은 완전히 pythonic이며 올바른 작업을 수행합니다.
나는 sys.hexversion
이런 것들을 좋아한다.
http://docs.python.org/library/sys.html#sys.hexversion
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
(2,6,4)
는 'final'
비교에 영향을하지 않는 것 그리고 그것은 아닌가요. 튜플의 "가장 중요한"부분을 비교할 때 슬라이싱이 필요하지 않습니다. 이것은 치료 방법이며 내 질문에 관한 것입니다. 나는이 솔루션에 장점이 없다고 말하는 것이 아니라 왜 그것이 가장 좋은지, 즉 내가 잃어버린 것이 무엇인지 궁금합니다.
가장 좋은 방법은 아마도 다음과 같습니다.
>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
... print "Error, I need python 2.6"
... else:
... from my_module import twoPointSixCode
>>>
또한 항상 간단한 시도로 가져 오기를 래핑 할 수 있으며 구문 오류가 발생합니다. 그리고 @Heikki의 지적에 따르면이 코드는 이전 버전의 Python과 호환됩니다.
>>> try:
... from my_module import twoPointSixCode
... except Exception:
... print "can't import, probably because your python is too old!"
>>>
except Exception
너무 넓습니다. 예상되는 특정 예외를 사용하는 것이 더 좋지 않습니까?
except Exception:
자체 라인은 이미 현대 (2.X +) 파이썬을 가정합니다. 어쩌면 미래의 일부 파이썬은 이전 버전과 호환되지 않는 방식으로 예외 이름을 재 배열합니까? (아마도 그렇지는 않지만, 누가 우리 모두가 오큘 러스 리프트 안구 임플란트를 가지고있을 때 20 년 안에 파이썬이 어떻게 보일지 알고 있습니까? 코드는 오래 지속됩니다.)
사용 platform
의python_version
다음 stdlib에서 :
>>> from platform import python_version
>>> print(python_version())
2.7.8
다음과 같은 것을 넣으십시오.
#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
sys.stderr.write("You need python 2.6 or later to run this script\n")
exit(1)
스크립트 상단에
스크립트에있는 내용에 따라 대상보다 이전 버전의 python은 스크립트를로드하지 못할 수도 있으므로이 오류를보고하기에 충분하지 않습니다. 이 문제를 해결하려면 최신 코드로 스크립트를 가져 오는 스크립트에서 위의 코드를 실행할 수 있습니다.
x if Pred() else y
합니다. "lexing"단계에서 죽을 것이고 실제로 실행할 기회는 없습니다 exit(1)
. Seth의 답변 은 다른 파일에 새로운 언어 기능을 캡슐화하는 데 정확합니다.
else
분기 또는 해당에 <
사용 version_info
됩니까? AFAIK Python은 튜플에서 누락 된 값을 채 웁니다.이 모든 것이 2.6 이전에 유효해야합니다. 따라서 Seth의 답변은 슬라이싱 (중복)을 사용하지만 그렇지 않은 것은 귀하의 의견을 더욱 혼란스럽게 만듭니다.
다음은 바로 종료되는 짧은 명령 줄 버전입니다 (스크립트 및 자동 실행에 적합).
python -c "print(__import__('sys').version)"
또는 메이저, 마이너 및 마이크로 :
python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)
python2 --version
및 python3 --version
PHP에서입니다. 를 통해 문제없이 후자를 얻을 수 있지만 passthru()
전자는 화면으로 인쇄하지만 파일로 리디렉션 될 때도 캡처되지 않습니다 ...
print()
파일이 더 편리하다면 파일에 쓰라고 말할 수 있습니다 .
passthru()
출력을 파일로 리디렉션하는 것과 동일 합니다. 귀하의 솔루션은 내가 필요한 것을 정확하게 수행합니다. :)
Seth가 말했듯이 기본 스크립트는 확인할 수 sys.version_info
있지만 2.0 이전에는 나타나지 않았으므로 이전 버전을 지원하려면 sys 모듈의 다른 버전 속성을 확인해야합니다.
그러나 이전 Python 버전에서는 사용할 수없는 파일에서 Python 언어 기능을 사용하지 않도록주의해야합니다. 예를 들어, 이것은 Python 2.5 이상에서 허용됩니다.
try:
pass
except:
pass
finally:
pass
그러나 이전 Python 버전에서는 작동하지 않습니다. OR을 제외하고는 시도와 만 일치 할 수 있기 때문입니다. 따라서 이전 Python 버전과의 호환성을 위해서는 다음을 작성해야합니다.
try:
try:
pass
except:
pass
finally:
pass
몇 가지 답변은 이미 현재 파이썬 버전 을 쿼리 하는 방법을 제안합니다 . 프로그래밍 방식으로 버전 요구 사항 을 확인 하기 위해 다음 두 가지 방법 중 하나를 사용합니다.
# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))
# Method 2:
import platform
from distutils.version import StrictVersion
assert(StrictVersion(platform.python_version()) >= "2.6")
재미를 위해 다음은 CPython 1.0-3.7b2, Pypy, Jython 및 Micropython에서 수행하는 방법입니다. 이것은 현대 코드에서 수행하는 방법보다 호기심이 많습니다. http://stromberg.dnsalias.org/~strombrg/pythons/의 일부로 작성했습니다. 이 코드는 여러 버전의 Python에서 한 번에 코드 스 니펫을 테스트하기위한 스크립트이므로 파이썬에 대한 느낌을 쉽게 얻을 수 있습니다 기능은 어떤 버전의 파이썬과 호환됩니다.
via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
import platform
except (ImportError, NameError):
# We have no platform module - try to get the info via the sys module
check_sys = 1
if not check_sys:
if hasattr(platform, "python_version"):
via_platform = 1
else:
check_sys = 1
if check_sys:
try:
import sys
test_sys = 1
except (ImportError, NameError):
# just let via_sys_version_info and via_sys_version remain False - we have no sys module
pass
if test_sys:
if hasattr(sys, "version_info"):
via_sys_version_info = 1
elif hasattr(sys, "version"):
via_sys_version = 1
else:
# just let via_sys remain False
pass
if via_platform:
# This gives pretty good info, but is not available in older interpreters. Also, micropython has a
# platform module that does not really contain anything.
print(platform.python_version())
elif via_sys_version_info:
# This is compatible with some older interpreters, but does not give quite as much info.
print("%s.%s.%s" % sys.version_info[:3])
elif via_sys_version:
import string
# This is compatible with some older interpreters, but does not give quite as much info.
verbose_version = sys.version
version_list = string.split(verbose_version)
print(version_list[0])
else:
print("unknown")
파이썬 버전을 확인합니다 : python -V
하거나 python --version
또는apt-cache policy python
whereis python
설치된 버전 수 를 확인하기 위해 실행할 수도 있습니다 .
from sys import version_info, api_version, version, hexversion
print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")
산출
sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] sys.api_version: 1013 sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0) sys.hexversion: 50726384
print("sys.version: {}".format(version))
.
sys.version_info
tuple
3.7 을 반환하지 않는 것 같습니다 . 오히려 특수 클래스를 반환하므로 튜플을 사용하는 모든 예제가 작동하지 않습니다. 다음은 파이썬 콘솔의 출력입니다.
>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>
나는의 조합을 사용하여 것으로 나타났습니다 sys.version_info.major
과 sys.version_info.minor
충분할 것 같다. 예를 들어 ...
import sys
if sys.version_info.major > 3:
print('Upgrade to Python 3')
exit(1)
파이썬 3을 실행하고 있는지 확인합니다. 더 구체적인 버전을 확인할 수도 있습니다 ...
import sys
ver = sys.version_info
if ver.major > 2:
if ver.major == 3 and ver.minor <= 4:
print('Upgrade to Python 3.5')
exit(1)
Python 3.5 이상을 실행 중인지 확인할 수 있습니다.
namedtuple
으며 tuple과 비교하면 확실히 작동합니다. 완전한 평등을 얻으려면 메이저, 마이너, 마이크로, 릴리스 레벨 (문자열) 및 일련 번호의 5 가지 요소가 필요합니다.
하나의 단일 명령으로 명령 줄에서 확인하지만 주 버전, 부 버전, 마이크로 버전, 릴리스 수준 및 일련 번호를 포함합니다 .
> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"
3.7.6-final-0
참고 : .format()
f- 문자열 대신 또는 '.'.join()
임의 형식 및 구분 문자를 사용할 수 있습니다 (예 :이를 한 단어 문자열로 사용할 수 있도록). 파이썬, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ 등 모든 중요한 버전을보고하는 bash 유틸리티 스크립트에 이것을 넣었습니다. 로깅, 복제 성, 문제 해결 등에 버그 .
리눅스에서 작업하는 경우 명령 python
출력을 다음과 같이하십시오.
파이썬 2.4.3 (# 1, 2009 년 6 월 11 일, 14:09:37)
linux2의 [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)]
자세한 내용은 "도움말", "저작권", "신용"또는 "라이센스"를 입력하십시오.
Python
스크립트 내에서 버전 을 얻는 데 도움이되지 않습니다. 이전에 이미 게시 된 비슷한 답변 : stackoverflow.com/a/35294211/950762