मैं यह कैसे जांचूं कि पायथन का कौन सा संस्करण मेरी स्क्रिप्ट चला रहा है?


1183

मैं यह कैसे जांच सकता हूं कि पायथन इंटरप्रेटर का कौन सा संस्करण मेरी स्क्रिप्ट की व्याख्या कर रहा है?


1
वर्तमान धागा एक अजगर कार्यक्रम / स्क्रिप्ट से अजगर संस्करण की जाँच करने के बारे में है। यदि आप कमांड लाइन से अपनी मशीन पर स्थापित अजगर इंटरप्रेटर के संस्करण की जांच करना चाहते हैं, तो कृपया निम्नलिखित पोस्ट देखें - मैंने किस पायथन का संस्करण स्थापित किया है?
RBT

1
यहाँ अजगर 3 और 2 को अलग करने का एक मजेदार तरीका है ...python_version = int(str(range(3))[-2])
Chris_Rands

@ आरबीटी: कमांड लाइन से एक-लाइन की जांच के लिए, मेरा जवाब देखें ।
एसएमसीआई

जवाबों:


1377

यह जानकारी sys.version स्ट्रिंग में sys मॉड्यूल में उपलब्ध है:

>>> 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

पायथन दुभाषिया की एक न्यूनतम संस्करण आवश्यकता के साथ एक स्क्रिप्ट चलाने के लिए इसे अपने कोड में जोड़ें:

assert sys.version_info >= (2, 5)

यह प्रमुख और लघु संस्करण जानकारी की तुलना करता है। सूक्ष्म (= जोड़ें 0, 1, आदि) और यहां तक कि releaselevel (= 'alpha', 'final'आप की तरह के रूप में टपल करने के लिए, आदि)। हालाँकि, ध्यान दें कि यह निश्चित रूप से "बतख" चेक करने के लिए लगभग हमेशा बेहतर होता है यदि एक निश्चित सुविधा है, और यदि नहीं, तो वर्कअराउंड (या बाहर जमानत)। कभी-कभी नई रिलीज़ में सुविधाएँ चली जाती हैं, दूसरों द्वारा प्रतिस्थापित की जाती हैं।


39
यह वास्तव में प्रिंट के लिए वाक्य रचना है। संस्करण की जाँच के लिए नहीं। मैं अपने अजगर 2 और 3 लिपियों में इसका उपयोग करता हूं:PY3 = sys.version_info[0] == 3
gcb

5
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz

25
आप कुछ फ़ील्ड्स sys.version_infoको गुणों के रूप में भी एक्सेस कर सकते हैं, इसलिए PY3 = sys.version_info.major == 3थोड़ा अधिक आकर्षक लग सकता है।
krs013

1
नोट: sys.hexversion 0x020502F0 की तुलना में है, देखना docs.python.org/2/library/sys.html#sys.hexversion
Yinon एहर्लिच

1
जब भी पायथन 4 होता है @gcb आपका कोड स्निपेट टूट जाएगा। आपको करना चाहिए if sys.version_info >= (3,)। यह विभिन्न आकार के ट्यूल की तुलना करने के लिए पूरी तरह से अजगर है और यह सही काम करेगा।
बोरिस

374

कमांड लाइन से (राजधानी 'V' पर ध्यान दें):

python -V

इसे 'मैन पाइथन' में प्रलेखित किया गया है।


13
कैपिटल वी का संस्करण है, निचला नहीं
दुष्ट

96

मुझे इस तरह sys.hexversionसे सामान पसंद है।

http://docs.python.org/library/sys.html#sys.hexversion

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True

यह एक निफ्टी संस्करण सुविधा है जिसे मैंने नहीं देखा था, और नियमित संस्करण की तुलना में (कम से कम मेरे लिए) उपयोग करने में थोड़ा आसान है ...
वेन वर्नर

6
@ सोरिन: क्या आप बता सकते हैं कि उदाहरण के लिए सेठ के उत्तर से यह कैसे बेहतर है? चूंकि आप कहते हैं कि यह सबसे अच्छा है, मुझे आश्चर्य है।
0xC0000022L

3
@ 0xC0000022L क्या आपने कभी सोचा है कि आप पाठ की तुलना टपल से कैसे कर पाएंगे? Final फाइनल ’बीटा, आरसी, या जो कुछ भी हो सकता है, उसकी तुलना कैसे करता है। इसके बजाय यदि आपके पास एक संख्यात्मक मान है, तो आप हमेशा एक सटीक संस्करण निर्दिष्ट करने में सक्षम होंगे।
सोरिन

1
@ सोरिन: उह, यह बिल्कुल मायने नहीं रखता है, है ना? अगर मैं तुलना करने (2,6,4)के 'final'लिए तुलना को प्रभावित करने के लिए प्रतीत नहीं होता है और यह नहीं माना जाता है। जब मैं टपल के "सबसे महत्वपूर्ण" हिस्सों की तुलना करता हूं, तो स्पष्ट रूप से किसी भी टुकड़ा करने की आवश्यकता नहीं होती है। ऐसा लगता है कि यह कैसे व्यवहार किया जाता है और यही मेरा सवाल था। मैं यह नहीं कह रहा हूं कि इस समाधान की अपनी योग्यता नहीं है, मैं सोच रहा हूं कि यह सबसे अच्छा क्यों है - यानी जो मुझे याद आ रहा है।
0xC0000022L

11
रिलीज स्तर को 'अल्फा', 'बीटा', 'उम्मीदवार', या 'फाइनल' में से एक के रूप में परिभाषित किया गया है, जो सही ढंग से तुलना करने के लिए भी होता है ...
फ्रेड्रिक

65

तुम्हारा सबसे अच्छा शर्त शायद ऐसा कुछ है:

>>> 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
>>> 

इसके अतिरिक्त, आप हमेशा अपने आयात को एक साधारण कोशिश में लपेट सकते हैं, जो वाक्यविन्यास त्रुटियों को पकड़ना चाहिए। और, @ हिक्की के बिंदु पर, यह कोड अजगर के पुराने संस्करणों के साथ संगत होगा:

>>> try:
...     from my_module import twoPointSixCode
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>

3
क्यों एक सादा अपवाद और एक आयात नहीं? : पी
घातक

4
@ पूरी तरह से - ImportError SyntaxErrors को नहीं पकड़ेगा, जो कि अगर आप एक पुराने पाइथन में नए सिंटैक्स का उपयोग करने की कोशिश करते हैं, जैसे कि प्री-2.5 में शॉर्टकट सशर्त का उपयोग करने की कोशिश करेंगे ।
सेठ

except Exceptionबहुत व्यापक है। क्या विशिष्ट अपवादों का उपयोग करना बेहतर नहीं होगा जो आप उम्मीद करते हैं?
फर्मी विरोधाभास

1
@ वर्मीपरडॉक्स - व्यापक होने के कारण धारणाएँ कम रहती हैं। except Exception:अपने आप में लाइन पहले से ही एक आधुनिक (2.x +) अजगर मान लिया गया है। शायद कुछ भविष्य के अजगर कुछ पिछड़े-असंगत तरीके से अपवाद नामों को पुनर्व्यवस्थित करेंगे? (शायद नहीं, लेकिन कौन जानता है कि 20 साल में अजगर कैसा दिखेगा, जब हम सभी में ऑक्सुलस रिफ्ट आईबॉल प्रत्यारोपण होता है? कोड एक लंबे समय तक रहता है।)
सेठ

65

उपयोग platform'spython_version stdlib से:

>>> from platform import python_version
>>> print(python_version())
2.7.8

5
प्रिंट funtion के लिए, यह कोष्ठक में बेहतर होगा, संगतता के बारे में सोचा। यदि कोई संस्करण 3 में नमूना का उपयोग करता है, तो सिंटैक्स त्रुटि प्रतीक्षा होगी।
एलेक्स च्यांग

47

कुछ इस तरह रखो:

#!/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)

आपकी स्क्रिप्ट के शीर्ष पर।

ध्यान दें कि आपकी स्क्रिप्ट में और क्या है, इस आधार पर कि लक्ष्य से अजगर के पुराने संस्करण भी स्क्रिप्ट को लोड करने में सक्षम नहीं हो सकते हैं, इसलिए इस त्रुटि की रिपोर्ट करने के लिए पर्याप्त नहीं मिलेगा। वर्कअराउंड के रूप में, आप एक स्क्रिप्ट में ऊपर चला सकते हैं जो स्क्रिप्ट को अधिक आधुनिक कोड के साथ आयात करता है।


6
यह गलत है (या कम से कम, अधूरा) क्योंकि पुराने व्याख्याकार नए भाषा निर्माणों पर रोक लगा देंगे x if Pred() else y। वे "लेक्सिंग" चरण के दौरान मर जाएंगे, और वास्तव में निष्पादित करने का मौका कभी नहीं होगा exit(1)सेठ का उत्तर नई भाषा की विशेषताओं को अन्य फाइलों में संलग्न करने में सही है।
मार्क रसखॉफ़

2
@MarkRushakoff: आपकी टिप्पणी भ्रामक है। इस उत्तर का कौन सा पहलू गलत है? लापता elseशाखा या जिसका <उपयोग किया जाता है version_info? AFAIK पायथन पैड ट्यूपल्स में लापता मान, और यह सब 2.6 से पहले वैध होना चाहिए, नहीं? तो सेठ का जवाब यह (क्योंकि यह आपकी टिप्पणी को और अधिक भ्रमित करता है) नहीं करता है।
0xC0000022L

5
मुझे लगता है कि @MarkRushakoff क्या कह रहा है कि यदि आपके पास किसी फ़ाइल के शीर्ष पर है, और उसी फ़ाइल में कहीं और एक नई भाषा की सुविधा है, तो फ़ाइल लोड करते समय अजगर का पुराना संस्करण मर जाएगा, इससे पहले कि वह इसे चलाता है, इसलिए त्रुटि नहीं दिखाई जाएगी। मूल रूप से आपको एक फ़ाइल के शीर्ष पर (या अन्य चेक) डालना होगा, फिर उस कोड को आयात करें जिसे अलग-अलग फ़ाइलों से अजगर के नए संस्करण की आवश्यकता होती है।
rjmunro

1
हां, जो @rjmunro ने कहा :)
मार्क रुशकोफ

25

यहां एक छोटा कमांडलाइन संस्करण है जो सीधे बाहर निकलता है (स्क्रिप्ट और स्वचालित निष्पादन के लिए आसान):

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)

1
@ विजिलेंसर आप सही कह रहे हैं, लिखने के समय यह अभी तक प्रासंगिक नहीं था, लेकिन मैंने इसे पायथन 3 के लिए अभी अपडेट किया है :)
वोल्फ

अच्छा, यह मेरी समस्या को हल करता है जहां मैं PHP से python2 --versionऔर के आउटपुट को कैप्चर करके संस्करण संख्या प्राप्त कर रहा था python3 --version। जबकि मैं बाद की समस्याओं के बिना बाद में मिल जाएगा passthru(), पूर्व केवल स्क्रीन पर प्रिंट होगा, लेकिन कभी भी कब्जा नहीं किया जाएगा, यहां तक ​​कि जब एक फ़ाइल में पुनर्निर्देशित किया जाता है ...
Tox

1
@tox यदि आप print() अधिक सुविधाजनक हैं तो आप किसी फाइल को लिखना बता सकते हैं ।
22

मेरे मामले में यह उसी तरह से अधिक होगा जैसा कि मैं पहले से ही passthru()आउटपुट को किसी फ़ाइल में रीडायरेक्ट कर रहा हूं । आपका समाधान वही करता है जो मुझे चाहिए। :)
टोक्स

14

sixमॉड्यूल के साथ , आप इसे कर सकते हैं:

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x

8
import sys
sys.version.split(' ')[0]

sys.version आपको वही देता है जो आप चाहते हैं, बस पहला नंबर लें :)


5

सबसे सरल तरीका

बस अपने टर्मिनल में अजगर टाइप करें और आप निम्न के रूप में संस्करण देख सकते हैं

desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

23
"सबसे सरल तरीका" ... जो कुछ पूछा गया था, उससे अलग कुछ करने के लिए।
लुक

4

जैसे सेठ ने कहा, मुख्य स्क्रिप्ट की जांच कर सकता है sys.version_info(लेकिन ध्यान दें कि 2.0 तक दिखाई नहीं देता था, इसलिए यदि आप पुराने संस्करणों का समर्थन करना चाहते हैं तो आपको sys मॉड्यूल की एक और संस्करण संपत्ति की जांच करने की आवश्यकता होगी)।

लेकिन आपको अभी भी फ़ाइल में किसी भी पायथन भाषा सुविधाओं का उपयोग नहीं करने की आवश्यकता है जो पुराने पायथन संस्करणों में उपलब्ध नहीं हैं। उदाहरण के लिए, पायथन 2.5 और बाद में इसकी अनुमति है:

try:
    pass
except:
    pass
finally:
    pass

लेकिन पुराने पायथन संस्करणों में काम नहीं करेगा, क्योंकि आप केवल को छोड़कर या कोशिश से मेल खा सकते हैं। तो पुराने पायथन संस्करणों के साथ संगतता के लिए आपको लिखना होगा:

try:
    try:
        pass
    except:
        pass
finally:
    pass

2

कई उत्तर पहले से ही मौजूदा अजगर संस्करण को क्वेरी करने का सुझाव देते हैं । प्रोग्राम संबंधी आवश्यकताओं की जाँच करने के लिए , मैं निम्नलिखित दो विधियों में से एक का उपयोग करूँगा:

# 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")

2

बस मज़े के लिए, निम्नलिखित CPython 1.0-3.7b2, Pypy, Jython और Micropython पर करने का एक तरीका है। यह आधुनिक कोड में करने के तरीके की तुलना में अधिक जिज्ञासा है। मैंने इसे http://stromberg.dnsalias.org/~strombrg/pythons/ के भाग के रूप में लिखा था , जो एक ही बार में अजगर के कई संस्करणों पर कोड के स्निपेट के परीक्षण के लिए एक स्क्रिप्ट है, इसलिए आप आसानी से समझ सकते हैं कि अजगर क्या है पायथन के किन संस्करणों के साथ सुविधाएँ संगत हैं:

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")

2

पायथन संस्करण की जाँच करें: python -Vया python --versionयाapt-cache policy python

आप यह whereis pythonदेखने के लिए भी चल सकते हैं कि कितने संस्करण स्थापित हैं।


3
एक ही जवाब पहले से ही पोस्ट किया गया था। और, सवाल यह नहीं है कि "मैं कैसे जांचता हूं कि मैंने अजगर के किस संस्करण को स्थापित किया है?" लेकिन "मैं अपनी स्क्रिप्ट में संस्करण की जांच कैसे करूं"।
स्टेनली कोऊ

2

यदि आप पूर्व पायथन 3 का पता लगाना चाहते हैं और कुछ भी आयात नहीं करना चाहते हैं ...

... आप कर सकते हैं (एब) सूची का उपयोग करें स्कोपिंग परिवर्तन की समझ और इसे एक ही अभिव्यक्ति में करें :

is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)

2

विंडोज पर कमांड के लिए पायथन संस्करण को सत्यापित करने के लिए, कमांड प्रॉम्प्ट में निम्नलिखित कमांड चलाएं और आउटपुट को सत्यापित करें

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

इसके अलावा, प्रत्येक पायथन संस्करण के लिए फ़ोल्डर कॉन्फ़िगरेशन देखने के लिए, निम्नलिखित कमांड चलाएँ:

For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'

2
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

पायथन 2.7 के लिए, हमें इसका उपयोग करना चाहिए print("sys.version: {}".format(version))
मार्को

@ मार्को, सही है। स्ट्रिंग स्वरूपण v 3+ के लिए खोजशब्द तर्क के साथ किया जाता है। प्रिंट के लिए किया जा सकता है ('[{}, {}, {}]'। स्वरूप (1,2,3)) अजगर के लिए 2.7 रेफरी: stackoverflow.com/questions/517355/string-formatting-in-python
oetzi

1

sys.version_infotuple3.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)

यह देखने के लिए जांचें कि क्या आप कम से कम पायथन 3.5 चला रहे हैं।


यह एक उपवर्ग की तरह कुछ है namedtupleऔर टपल के साथ तुलना करना निश्चित रूप से काम करता है। पूर्ण समानता प्राप्त करने के लिए आपको पांच-तत्व typle की आवश्यकता होती है: प्रमुख, मामूली, सूक्ष्म, रिलीज़लेवल (स्ट्रिंग) और धारावाहिक।
मिखाइल एडोशिन

0

और भी सरल तरीका:

स्पाइडर में, एक नया "आईपीथॉन कंसोल" शुरू करें, फिर अपनी किसी भी मौजूदा स्क्रिप्ट को चलाएं।

अब संस्करण को कंसोल विंडो में मुद्रित पहले आउटपुट में देखा जा सकता है:

"पायथन 3.7.3 (डिफ़ॉल्ट, अप्रैल 24 2019, 15:29:51) ..."

यहां छवि विवरण दर्ज करें


0

कमांड-लाइन से जांच करने के लिए, एक ही कमांड में, लेकिन प्रमुख, लघु, लघु संस्करण, रिलीज़लेवल और सीरियल शामिल करें :

> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0

नोट: .format()एफ-स्ट्रिंग्स के बजाय या '.'.join()आपको मनमाने स्वरूपण और विभाजक वर्णों का उपयोग करने की अनुमति देता है, जैसे कि यह एक शब्द-रहित स्ट्रिंग बनाने के लिए। मैंने इसे एक बैश यूटिलिटी स्क्रिप्ट के अंदर डाला जो सभी महत्वपूर्ण संस्करणों की रिपोर्ट करता है: अजगर, सुन्न, पांडा, स्केलेर, मैकओएस, एक्सकोड, क्लैंग, काढ़ा, एनाकोंडा, जीसीसी / जी ++ आदि आदि लॉगिंग, प्रतिकृति, समस्या निवारण बग-रिपोर्टिंग आदि के लिए उपयोगी है। ।


-1

यदि आप linux पर काम कर रहे हैं तो सिर्फ कमांड python आउटपुट दें , ऐसा होगा

अजगर 2.4.3 (# 1, 11 जून 2009, 14:09:37)

[जीसीसी 4.1.2 20080704 (Red Hat 4.1.2-44)] linux2 पर

अधिक जानकारी के लिए "सहायता", "कॉपीराइट", "क्रेडिट" या "लाइसेंस" टाइप करें।


5
मैं चाहता हूं कि मेरी पायथन लिपि अजगर के संस्करण को प्राप्त करने में सक्षम हो जो इसे व्याख्या कर रहा है। सही उत्तर को स्वीकार कर लिया गया है।
वाहक

Pythonस्क्रिप्ट के भीतर संस्करण प्राप्त करने में मदद नहीं करता है , इसी तरह का उत्तर पहले से पहले से ही पोस्ट किया गया है: stackoverflow.com/a/35294211/950762
Akif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.