Python Tercümanı'nın hangi versiyonunun senaryomu yorumladığını nasıl kontrol edebilirim?
python_version = int(str(range(3))[-2])
Python Tercümanı'nın hangi versiyonunun senaryomu yorumladığını nasıl kontrol edebilirim?
python_version = int(str(range(3))[-2])
Yanıtlar:
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
, 1
vb) 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.
PY3 = sys.version_info[0] == 3
sys.version_info
özellikler olarak da erişebilirsiniz , bu yüzden PY3 = sys.version_info.major == 3
biraz daha çekici olabilir.
if sys.version_info >= (3,)
. Farklı boyutlardaki tuplleri karşılaştırmak tamamen pitoniktir ve doğru olanı yapar.
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
(2,6,4)
'final'
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!"
>>>
except Exception
çok geniş. Beklediğiniz özel istisnaları kullanmak daha iyi olmaz mıydı?
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.)
platform
'Spython_version
stdlib kullanın :
>>> from platform import python_version
>>> print(python_version())
2.7.8
Şö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.
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.
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.
İş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)
python2 --version
ve python3 --version
PHP. Ben ikincisini sorun yaşamadan alırken passthru()
, eski sadece ekrana yazdırır, ancak bir dosyaya yönlendirildiğinde bile asla yakalanmaz ...
print()
bir dosyaya yazmayı söyleyebilirsiniz .
passthru()
çıktı bir dosyaya yönlendiriyorum ile aynı olurdu . Çözümünüz tam olarak ihtiyacım olanı yapıyor. :)
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.
>>>
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
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")
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")
Python sürümünü kontrol edin: python -V
veya python --version
veyaapt-cache policy python
whereis python
kaç sürümün kurulu olduğunu görmek için de çalıştırabilirsiniz .
... (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)
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'
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
print("sys.version: {}".format(version))
.
sys.version_info
tuple
3.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.major
ve sys.version_info.minor
yeterli 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.
namedtuple
ve 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.
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. .
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.
Python
Komut 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