Programing

새로운 언어 기능을 사용하는 프로그램에서 Python 버전을 확인하려면 어떻게해야합니까?

lottogame 2020. 4. 13. 08:07
반응형

새로운 언어 기능을 사용하는 프로그램에서 Python 버전을 확인하려면 어떻게해야합니까?


적어도 특정 버전의 Python이 필요한 Python 스크립트가있는 경우 이전 버전의 Python을 사용하여 스크립트를 시작할 때 정상적으로 실패하는 올바른 방법은 무엇입니까?

오류 메시지를 발행하고 종료 할 수있을 정도로 일찍 제어하려면 어떻게해야합니까?

예를 들어, ternery 연산자 (2.5의 새로운 기능)와 "with"블록 (2.6의 새로운 기능)을 사용하는 프로그램이 있습니다. 스크립트가 가장 먼저 호출하는 간단한 인터프리터 버전 검사기 루틴을 작성했습니다. 대신, 내 루틴이 호출되기 전에 파이썬 컴파일 중에 스크립트가 실패합니다. 따라서 스크립트 사용자는 매우 모호한시 낙스 오류 역 추적을 보게됩니다. 이는 잘못된 버전의 Python을 실행하는 경우에 불과하다는 사실을 전문가가 추측해야합니다.

파이썬 버전을 확인하는 방법을 알고 있습니다. 문제는 이전 버전의 Python에서 일부 구문이 잘못되었다는 것입니다. 이 프로그램을 고려하십시오 :

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

2.4 미만으로 실행하면이 결과를 원합니다.

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

이 결과가 아닙니다.

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(동료를위한 채널링)


다음을 사용하여 테스트 할 수 있습니다 eval.

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

또한, with 파이썬 2.5에서, 단지 추가 가능합니다 from __future__ import with_statement.

편집 : 충분히 일찍 제어 .py하려면 가져 오기 전에 (예 __init__.py: 패키지에서) 다른 파일 로 분할 하고 기본 파일의 호환성을 확인할 수 있습니다 .

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *

다음을 수행하는 프로그램 주위에 랩퍼를 두십시오.

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

또한 사용을 고려할 수 sys.version()는 2.0 이전 파이썬 인터프리터를 사용하는 만남의 사람들에게하려는 경우,하지만 당신은 할 수있는 몇 가지 정규식이 있습니다.

그리고 이것을하는 더 우아한 방법이있을 수 있습니다.


시험

수입 플랫폼
platform.python_version ()

"2.3.1"과 같은 문자열을 제공해야합니다. 이것이 정확히 맞지 않으면 "플랫폼"내장을 통해 사용할 수있는 풍부한 데이터 세트가 있습니다. 당신이 원하는 것은 어딘가에 있어야합니다.


이 버전 비교를 수행하는 가장 좋은 방법은을 사용하는 것 sys.hexversion입니다. 버전 튜플을 비교하면 모든 파이썬 버전에서 원하는 결과를 얻지 못하기 때문에 중요합니다.

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"

import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")

AskUbuntu의 Nykakin 답변 :

platform표준 라이브러리의 모듈을 사용하여 코드 자체에서 Python 버전을 확인할 수도 있습니다.

두 가지 기능이 있습니다 :

  • platform.python_version() (문자열을 반환).
  • platform.python_version_tuple() (튜플을 반환).

파이썬 코드

예를 들어 파일을 작성하십시오. version.py)

버전을 확인하는 쉬운 방법 :

import platform

print(platform.python_version())
print(platform.python_version_tuple())

다음 eval방법을 사용할 수도 있습니다 .

try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

명령 행에서 Python 파일을 실행하십시오.

$ python version.py 
2.7.11
('2', '7', '11')

Windows 10에서 WAMP Server를 통해 CGI를 사용한 Python 출력 :

Suriyaa Kudo의 스크린 샷 2016-11-16 14.39.01


유용한 자료


이전 버전과의 호환성을 유지하기 위해 Python 2.4에서 세트는 핵심 언어의 일부가되었습니다. 나는 그때 그 일을했는데, 그것은 당신에게도 효과가 있습니다.

if sys.version_info < (2, 4):
    from sets import Set as set

문제는 있지만 오류 메시지를 발행 하고 종료 하기에 충분히 일찍 제어하려면 어떻게해야 합니까?

내가 대답하는 질문은 다음과 같습니다. 앱을 시작하기 전에 오류 메시지를 발행하기에 충분히 일찍 제어하려면 어떻게해야 합니까?

다른 게시물과는 많이 다르게 대답 할 수 있습니다. 지금까지 답변이 Python 내에서 귀하의 질문을 해결하려고하는 것 같습니다.

파이썬을 시작하기 전에 버전을 확인하십시오. 나는 당신의 경로가 리눅스 또는 유닉스임을 봅니다. 그러나 Windows 스크립트 만 제공 할 수 있습니다. 나는 그것을 리눅스 스크립팅 구문에 적응시키는 것은 그리 어렵지 않을 것이다.

버전 2.7의 DOS 스크립트는 다음과 같습니다.

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

이것은 응용 프로그램의 일부를 실행하지 않으므로 Python 예외가 발생하지 않습니다. 임시 파일을 작성하거나 OS 환경 변수를 추가하지 않습니다. 버전 구문 규칙이 다르기 때문에 앱을 예외로 끝내지 않습니다. 보안 액세스 지점이 3 개 줄었습니다.

FOR /F라인의 핵심입니다.

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

여러 파이썬 버전 확인 URL을 확인하십시오 : http://www.fpschultze.de/modules/smartfaq/faq.php?faqid=17

그리고 내 해킹 버전 :

[MS 스크립트; Python 모듈의 Python 버전 확인 사전 출시] http://pastebin.com/aAuJ91FQ


import sys
sys.version

이 같은 대답을 얻을 것이다

'2.7.6 (기본값, 2016 년 10 월 26 일, 20:30:19) \ n [GCC 4.8.4]'

여기 2.7.6 은 버전입니다


위에서 언급 한 것처럼 구문 오류는 런타임이 아니라 컴파일 타임에 발생합니다. 파이썬은 "통역 된 언어"이지만, 파이썬 코드는 실제로 직접 해석되지는 않습니다. 바이트 코드로 컴파일 된 다음 해석됩니다. 컴파일 단계는 모듈을 가져올 때 (.pyc 또는 .pyd 파일 형식으로 사용 가능한 이미 컴파일 된 버전이없는 경우) 발생하며 오류가 발생했을 때 발생합니다 (정확하지 않음). 코드가 실행 중입니다.

컴파일 단계를 끝내고 위에서 언급 한대로 eval을 사용하여 원하는 경우 한 줄의 코드에 대해 런타임에 수행 할 수는 있지만 개인적으로이를 피하는 것이 좋습니다. 불필요 한 런타임 컴파일, 한 가지, 다른 하나는 코드 혼란처럼 느껴집니다. (원하는 경우 코드를 생성하는 코드를 생성하는 코드를 생성 할 수 있으며 6 개월 후에이를 수정하고 디버깅하는 데 엄청난 시간을 할애 할 수 있습니다.) 대신 권장되는 것은 다음과 같습니다.

import sys
if sys.hexversion < 0x02060000:
    from my_module_2_5 import thisFunc, thatFunc, theOtherFunc
else:
    from my_module import thisFunc, thatFunc, theOtherFunc

.. 새로운 구문을 사용하는 함수가 하나만 있고 매우 짧은 경우에도 수행 할 작업입니다. (실제로 나는 그러한 함수의 수와 크기를 최소화하기 위해 모든 합리적인 조치를 취합니다. 심지어 단일 구문 라인이있는 ifTrueAElseB (cond, a, b)와 같은 함수를 작성할 수도 있습니다.)

지적 할 가치가있는 또 다른 것은 (아직 아무도 지적하지 않은 것에 대해 약간 놀랐습니다) 파이썬의 이전 버전은 다음과 같은 코드를 지원하지 않았다는 것입니다

value = 'yes' if MyVarIsTrue else 'no'

..it 같은 코드를 지원했습니다

value = MyVarIsTrue and 'yes' or 'no'

그것은 삼항 표현을 쓰는 오래된 방법이었습니다. 필자는 아직 Python 3을 설치하지 않았지만 지금까지 알고있는 한 "오래된"방식이 여전히 작동하므로, 필요한 경우 새로운 구문을 조건부로 사용할 가치가 있는지 스스로 결정할 수 있습니다. 이전 버전의 Python 사용을 지원합니다.


파일 맨 위에 다음을 넣으십시오.

import sys

if float(sys.version.split()[0][:3]) < 2.7:
    print "Python 2.7 or higher required to run this code, " + sys.version.split()[0] + " detected, exiting."
    exit(1)

그런 다음 일반 Python 코드로 계속 진행하십시오.

import ...
import ...
other code...

가장 좋은 방법은 버전이 아닌 기능을 테스트하는 것입니다. 어떤 경우에는 사소한 것이지 다른 경우에는 그렇지 않습니다.

예 :

try :
    # Do stuff
except : # Features weren't found.
    # Do stuff for older versions.

try / except 블록을 충분히 사용하는 한 대부분의베이스를 커버 할 수 있습니다.


방금 빠른 검색 후이 질문을 발견하면서 직접 문제를 해결하려고 시도했으며 위의 제안 중 일부를 기반으로 하이브리드를 생각해 냈습니다.

필자는 래퍼 스크립트를 사용하는 DevPlayer의 아이디어를 좋아하지만 단점은 다른 OS에 대해 여러 개의 래퍼를 유지 관리하기 때문에 파이썬에서 래퍼를 작성하기로 결정했지만 동일한 기본 "exe를 실행하여 버전을 가져 오기"논리를 사용하기로 결정했습니다. 그리고 이것을 생각해 냈습니다.

2.5 이상에서 작동해야한다고 생각합니다. 나는 지금까지 Linux에서 2.66, 2.7.0 및 3.1.2에서 그리고 OS X에서 2.6.1에서 테스트했습니다.

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

예, 최종 디코딩 / 스트립 라인이 끔찍하다는 것을 알고 있지만 버전 번호를 빨리 잡고 싶었습니다. 나는 그것을 다듬을 것입니다.

이것은 현재로서는 나에게 잘 작동하지만, 누군가가 그것을 개선 할 수 있다면 (또는 그것이 끔찍한 아이디어인지 말해 줄 수 있다면) 너무 멋질 것입니다.


대한 독립 파이썬 스크립트, 다음 모듈의 문서화 문자열의 트릭은 파이썬 버전 (여기 v2.7.x) (* nix에서 스크립트 테스트) 작품을 적용합니다.

#!/bin/sh
''''python -V 2>&1 | grep -q 2.7 && exec python -u -- "$0" ${1+"$@"}; echo "python 2.7.x missing"; exit 1 # '''

import sys
[...]

이것은 누락 된 파이썬 실행 파일도 처리해야하지만 grep에 종속됩니다. 배경 여기참조 하십시오 .


sys.hexversion또는로 확인할 수 있습니다 sys.version_info.

sys.hexversion16 진수이므로 인간 친화적이지 않습니다. sys.version_info튜플이므로 더 인간 친화적입니다.

다음을 사용하여 Python 3.6 이상을 확인하십시오 sys.hexversion.

import sys, time
if sys.hexversion < 0x30600F0:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

다음을 사용하여 Python 3.6 이상을 확인하십시오 sys.version_info.

import sys, time
if sys.version_info[0] < 3 and sys.version_info[1] < 6:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

sys.version_info인간 친화적이지만 캐릭터가 더 많습니다. sys.hexversion비록 인간 친화적이지 않지만 권장 합니다.

이것이 도움이 되었기를 바랍니다.


akhan의 훌륭한 답변을 확장 하여 Python 스크립트가 컴파일 되기 전에 유용한 메시지를 인쇄합니다 .

스크립트가 Python 3.6 이상에서 실행되도록하려면 다음 두 줄을 Python 스크립트 맨 위에 추가하십시오.

#!/bin/sh
''''python3 -c 'import sys; sys.exit(sys.version_info < (3, 6))' && exec python3 -u -- "$0" ${1+"$@"}; echo 'This script requires Python 3.6 or newer.'; exit 1 # '''

(참고 : 두 번째 줄은 4 개의 작은 따옴표로 시작하고 3 개의 작은 따옴표로 끝납니다 . 이상하게 보일 수 있지만 오타가 아닙니다.)

이 솔루션의 장점은 3.6 이전의 Python 버전을 사용 print(f'Hello, {name}!')하는 SyntaxError경우 와 같은 코드로 인해 코드 가 발생하지 않는다는 것입니다. 대신이 유용한 메시지가 나타납니다.

This script requires Python 3.6 or newer.

물론이 솔루션은 유닉스 계열 쉘에서만 작동하며 스크립트가 직접 호출 된 경우 (예 ./script.py:), 적절한 eXecute 권한 비트가 설정되어 있어야합니다.


이것은 어떤가요:

import sys

def testPyVer(reqver):
  if float(sys.version[:3]) >= reqver:
    return 1
  else:
    return 0

#blah blah blah, more code

if testPyVer(3.0) == 1:
  #do stuff
else:
  #print python requirement, exit statement

문제는 매우 간단합니다. 버전이 있다면 당신은 확인 미만 , 2.4 이상이어야 거나 같음 . 따라서 파이썬 버전이 2.4이면 2.4 이상입니다. 당신이 가졌어야 할 것은 :

    if sys.version_info **<=** (2, 4):

아니

    if sys.version_info < (2, 4):

참고 URL : https://stackoverflow.com/questions/446052/how-can-i-check-for-python-version-in-a-program-that-uses-new-language-features

반응형