Scriptimi hangi Python sürümünün çalıştırdığını nasıl kontrol edebilirim?


1184

Python Tercümanı'nın hangi versiyonunun senaryomu yorumladığını nasıl kontrol edebilirim?


1
Geçerli iş parçacığı, bir python programından / komut dosyasından python sürümünü kontrol etmeyle ilgilidir. Makinenize kurulu python yorumlayıcısının sürümünü komut satırından kontrol etmek istiyorsanız, lütfen aşağıdaki gönderiye bakın - Hangi Python sürümünü yükledim?
RBT

1
İşte python 3 ve 2 ayırmak için eğlenceli bir yol ...python_version = int(str(range(3))[-2])
Chris_Rands

@RBT: komut satırından tek satırlık kontrol için, bkz cevabımı .
smci

Yanıtlar:


1377

Bu bilgi sys modülündeki sys.version dizesinde bulunur :

>>> import sys

İnsan tarafından okunabilir:

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

Daha fazla işlem için:

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

Bir komut dosyasının Python yorumlayıcısının en düşük sürüm gereksinimiyle çalışmasını sağlamak için bunu kodunuza ekleyin:

assert sys.version_info >= (2, 5)

Bu, büyük ve küçük sürüm bilgilerini karşılaştırır. (= Mikro ekle 0, 1vb) ve hatta releaselevel (= 'alpha', 'final'sen gibi tuplea, vs). Bununla birlikte, belirli bir özelliğin olup olmadığını ve yoksa geçici çözümün (veya kurtarmanın) "ördek" olmasının neredeyse her zaman daha iyi olduğuna dikkat edin. Bazen özellikler daha yeni sürümlerde yer değiştirir ve bunların yerini başkaları alır.


39
aslında baskı sözdizimidir. sürümü kontrol etmek için değil. ben python 2 ve 3 komut dosyalarında kullanın:PY3 = sys.version_info[0] == 3
gcb

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

25
Bazı alanlara sys.version_infoözellikler olarak da erişebilirsiniz , bu yüzden PY3 = sys.version_info.major == 3biraz daha çekici olabilir.
krs013

1
Not: sys.hexversion, 0x020502F0 ile karşılaştırılır, bkz. Docs.python.org/2/library/sys.html#sys.hexversion
Yinon Ehrlich

1
@gcb Python 4 gerçekleştiğinde kod snippet'iniz kesilir. Yapmalısın if sys.version_info >= (3,). Farklı boyutlardaki tuplleri karşılaştırmak tamamen pitoniktir ve doğru olanı yapar.
Boris

374

Komut satırından ('V' harfine dikkat edin):

python -V

Bu 'man python' ile belgelenmiştir.


13
büyük harf V versiyon, küçük harf değil
Rogue

96

Bunun gibi sys.hexversionşeyleri severim.

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

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

Bu görmediğim şık bir özellik ve kullanımı (en azından benim için) normal versiyondan biraz daha kolay ...
Wayne Werner

6
@sorin: Bunun nasıl Seth'in cevabından daha iyi olduğunu açıklayabilir misiniz? Bunun en iyisi olduğunu söylediğiniz için merak ediyorum.
0xC0000022L

3
@ 0xC0000022L Metin grubundaki metni nasıl karşılaştırabileceğinizi hiç merak ettiniz mi? 'Final' beta, rc veya ne olursa olsun nasıl karşılaştırılır. Bunun yerine sayısal bir değeriniz varsa, her zaman tam bir sürüm belirtebilirsiniz.
sorin

1
@sorin: uhm, bu hiç önemli değil, değil mi? Ben karşı karşılaştırırsanız karşılaştırma etkileyecek gibi görünmüyor ve olmaması gerekir. Görünüşe göre tupleın "en önemli" kısımlarını karşılaştırdığımda dilimleme gerekmez. Görünüşe göre böyle davranılıyor ve sorumun konusu buydu. Bu çözümün değeri olmadığını söylemiyorum, sadece neden en iyisi olduğunu merak ediyorum - yani eksik olduğum şey. (2,6,4)'final'
0xC0000022L

11
Salım seviyesi 'alfa', 'beta', 'aday' veya 'final' olarak tanımlanır ve bu da doğru bir şekilde karşılaştırılır ...
Fredrik

65

En iyi bahsiniz muhtemelen böyle bir şeydir:

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

Ayrıca, içe aktarmalarınızı her zaman sözdizimi hatalarını yakalaması gereken basit bir denemede sarabilirsiniz. Ve @ Heikki'nin noktasına gelince, bu kod python'un daha eski sürümleriyle uyumlu olacak:

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

3
Neden ImportError değil, basit bir İstisna? : P
ölümcül

4
@deadly - ImportError, 2.5 öncesi sürümlerde koşullu kısayolu kullanmaya çalışmak gibi eski bir pythonda yeni bir sözdizimi kullanmaya çalışırsanız atılacak SyntaxErrors'u yakalamaz .
Seth

except Exceptionçok geniş. Beklediğiniz özel istisnaları kullanmak daha iyi olmaz mıydı?
Fermi paradoksu

1
@Fermiparadox - Geniş olmak varsayımları düşük tutar. except Exception:Tek başına hat zaten modern (2.x +) piton varsayar. Belki gelecekteki bazı pitonlar, istisna adlarını geriye dönük olarak uyumsuz bir şekilde yeniden düzenleyebilir? (Muhtemelen hayır, ama hepimiz oculus rift göz küresi implantları olduğunda 20 yıl içinde python'un nasıl görüneceğini kim bilebilir? Kod uzun sürüyor.)
Seth

65

platform'Spython_version stdlib kullanın :

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

5
Baskı işlevi için, uyumluluk düşünülmüş parantezlerde daha iyi olurdu. Birisi sürüm 3'te örnek kullanırsa, sözdizimi hatası orada bekliyor olacaktır.
Alex Chiang

47

Şöyle bir şey koyun:

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

komut dosyanızın üst kısmında.

Senaryonuzda başka ne olduğuna bağlı olarak, python'un hedeften daha eski sürümlerinin betiği bile yükleyemeyebileceğini unutmayın, bu nedenle bu hatayı bildirmek için yeterince yeterli olmayacaktır. Geçici bir çözüm olarak, yukarıdaki komut dosyasını daha modern kodla içe aktaran bir komut dosyasında çalıştırabilirsiniz.


6
Bu yanlıştır (ya da en azından eksik), çünkü eski tercümanlar gibi yeni dil yapılarına engel olacaklardır x if Pred() else y. "Lexing" aşamasında ölecekler ve hiçbir zaman gerçekte icra etme şansları olmayacak exit(1). Seth'in yanıtı , diğer dosyalardaki yeni dil özelliklerini kapsüllemek için doğrudur.
Mark Rushakoff

2
@MarkRushakoff: Yorumunuz kafa karıştırıcı. Bu cevabın hangi yönü yanlış? Eksik elseşube veya a <için kullanılır version_info? AFAIK Python, eksik değerleri kaplarda doldurur ve tüm bunlar 2.6'dan önce geçerli olmalıdır, değil mi? Seth'in yanıtı dilimlemeyi (gereksiz olarak) kullanırken, bunu yapmaz ve bu da yorumunuzu daha da karmaşık hale getirir.
0xC0000022L

5
@MarkRushakoff'un söylediği şey, bir dosyanın üstünde ve aynı dosyanın başka bir yerinde yeni bir dil özelliğine sahipseniz, dosyayı yüklerken, herhangi bir dosyayı çalıştırmadan önce python'un eski sürümünün öleceğini, böylece hata gösterilmez. Temel olarak, yukarıdaki (veya başka bir denetimi) bir dosyanın üstüne koymanız ve ardından ayrı dosyalardan yeni bir python sürümü gerektiren kodu içe aktarmanız gerekir.
rjmunro

1
Evet, @rjmunro ne dedi :)
Mark Rushakoff

25

İşte hemen çıkan kısa bir komut satırı sürümü (komut dosyaları ve otomatik yürütme için kullanışlı):

python -c "print(__import__('sys').version)"

Veya sadece büyük, küçük ve mikro:

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
@vigilancer haklısın, yazarken henüz ilgili değildi ama Python 3 için şimdi güncelledim :)
Wolph

Güzel, bu şimdiye çıktısını yakalayarak sürüm numarasını başlamıştı benim sorunu çözer python2 --versionve python3 --versionPHP. Ben ikincisini sorun yaşamadan alırken passthru(), eski sadece ekrana yazdırır, ancak bir dosyaya yönlendirildiğinde bile asla yakalanmaz ...
Tox

1
@tox Daha uygunsa print() bir dosyaya yazmayı söyleyebilirsiniz .
Wolph

Benim durumumda bu zaten passthru()çıktı bir dosyaya yönlendiriyorum ile aynı olurdu . Çözümünüz tam olarak ihtiyacım olanı yapıyor. :)
Tox

14

İle sixmodül, bunu tarafından yapabilirsiniz:

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 size ne istediğinizi verir, sadece ilk sayıyı seçin :)


5

En basit yol

Sadece terminalinize python yazın ve sürümü aşağıdaki gibi görebilirsiniz

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
"En basit yol" ... istenenden farklı bir şey yapmanın yolu .
Luc

4

Seth'in dediği gibi, ana komut dosyası kontrol edebilir sys.version_info(ancak 2.0'a kadar görünmediğini unutmayın, bu nedenle eski sürümleri desteklemek istiyorsanız sys modülünün başka bir sürüm özelliğini kontrol etmeniz gerekir).

Ancak yine de dosyada eski Python sürümlerinde bulunmayan Python dil özelliklerini kullanmamaya dikkat etmeniz gerekir. Örneğin, buna Python 2.5 ve sonraki sürümlerde izin verilir:

try:
    pass
except:
    pass
finally:
    pass

ancak eski Python sürümlerinde çalışmaz, çünkü yalnızca VEYA dışında denemeyle eşleşebilirdiniz. Bu nedenle, eski Python sürümleriyle uyumluluk için şunları yazmanız gerekir:

try:
    try:
        pass
    except:
        pass
finally:
    pass

2

Birkaç cevap zaten mevcut python sürümünün nasıl sorgulanacağını önermektedir . To kontrol programlı sürüm gereksinimlerini, aşağıdaki iki yöntemden biriyle faydalanmak istiyorum:

# 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

Sadece eğlence için, CPython 1.0-3.7b2, Pypy, Jython ve Micropython'da bunu yapmanın bir yolu var. Bu, modern kodda yapmanın bir yolundan çok bir meraktır. Bir kerede python'un birçok versiyonunda bir kod snippet'ini test etmek için bir komut dosyası olan http://stromberg.dnsalias.org/~strombrg/pythons/ 'in bir parçası olarak yazdım , böylece hangi python için kolayca bir fikir edinebilirsiniz özellikleri hangi python sürümleriyle uyumludur:

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 sürümünü kontrol edin: python -Vveya python --versionveyaapt-cache policy python

whereis pythonkaç sürümün kurulu olduğunu görmek için de çalıştırabilirsiniz .


3
Aynı cevap zaten gönderildi. ve soru, "Hangi python sürümünü yüklediğimi nasıl kontrol ederim?" değil. ancak "Betiğimdeki sürümü nasıl kontrol ederim".
Stanley Kou

2

Python 3 öncesi tespit etmek ve herhangi bir şey almak istemiyorsanız ...

... (ab) liste anlama kapsamı değişikliklerini kullanabilir ve bunu tek bir ifadede yapabilirsiniz :

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

2

Windows'taki komutlar için Python sürümünü doğrulamak için, komut isteminde aşağıdaki komutları çalıştırın ve çıktıyı doğrulayın

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

Ayrıca, her Python sürümü için klasör yapılandırmasını görmek için aşağıdaki komutları çalıştırın:

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

çıktı

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

Python 2.7 için kullanmalıyız print("sys.version: {}".format(version)).
Marco

@Marco, doğru. dize biçimlendirmesi v 3+ için anahtar kelime değişkenleriyle yapılır. python 2.7 için baskı ('[{}, {}, {}]'. biçiminde (1,2,3)) yapılabilir: stackoverflow.com/questions/517355/string-formatting-in-python
oetzi

1

sys.version_infotuple3.7 olarak geri dönmek gibi görünmüyor . Aksine, özel bir sınıf döndürür, bu yüzden tuples kullanan tüm örnekler işe yaramaz, en azından benim için. İşte bir python konsolundan çıktı:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

Ben bir kombinasyonu kullanarak buldum sys.version_info.majorve sys.version_info.minoryeterli gibi görünüyor. Örneğin,...

import sys
if sys.version_info.major > 3:
    print('Upgrade to Python 3')
    exit(1)

Python 3 çalıştırıp çalıştırmadığınızı kontrol eder.

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)

en az Python 3.5 çalıştırıp çalıştırmadığınızı kontrol edebilir.


Bu bir alt sınıf gibi bir şey namedtupleve tuple ile karşılaştırmak kesinlikle işe yarıyor. Tam eşitliği elde etmek için beş elementli bir tipe ihtiyacınız var: majör, minör, mikro, releaselevel (string) ve seri.
Mikhail Edoshin

0

En basit yol:

Spyder'da yeni bir "IPython Konsolu" başlatın, ardından mevcut komut dosyalarınızdan herhangi birini çalıştırın.

Artık sürüm, konsol penceresinde yazdırılan ilk çıktıda görülebilir:

"Python 3.7.3 (varsayılan, 24 Nis 2019, 15:29:51) ..."

resim açıklamasını buraya girin


0

Komut satırından tek bir komutta kontrol etmek, ancak büyük, küçük, mikro sürüm, releaselevel ve seri eklemek için :

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

3.7.6-final-0

Not: .format()f-dizeleri yerine veya '.'.join()rastgele biçimlendirme ve ayırıcı karakterleri kullanmanıza izin verir, örneğin bunu bir tek kelimeli dize yapmak için. Bunu tüm önemli sürümleri rapor eden bir bash yardımcı programına koydum: python, numpy, pandalar, sklearn, MacOS, xcode, clang, demlemek, konda, anaconda, gcc / g ++ vb. .


-1

Eğer linux üzerinde çalışıyorsanız sadece komut python çıkışı verin şöyle olacak

Python 2.4.3 (# 1, 11 Haz 2009, 14:09:37)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] linux2 üzerinde

Daha fazla bilgi için "yardım", "telif hakkı", "kredi" veya "lisans" yazın.


5
Benim python komut dosyası yorumlayan python sürümünü elde edebilmek istiyorum. Doğru cevap kabul edildi.
taşıyıcı

PythonKomut dosyası içinde sürüm almanıza yardımcı olmaz, daha önce de benzer bir yanıt gönderildi: stackoverflow.com/a/35294211/950762
Akif
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.