Bagaimana cara memeriksa versi Python yang menjalankan skrip saya?

1185

Bagaimana saya bisa memeriksa versi apa dari Penafsir Python yang menafsirkan skrip saya?

pembawa
sumber
1
Utas saat ini adalah tentang memeriksa versi python dari program / skrip python. Jika Anda ingin memeriksa versi interpreter python yang terinstal di komputer Anda dari command line, silakan lihat posting berikut - Versi Python mana yang telah saya instal?
RBT
1
di sini adalah cara yang menyenangkan untuk memisahkan python 3 dan 2 ...python_version = int(str(range(3))[-2])
Chris_Rands
@RBT: untuk pemeriksaan satu baris dari baris perintah, lihat jawaban saya .
smci

Jawaban:

1378

Informasi ini tersedia di string sys.version dalam modul sys :

>>> import sys

Dapat dibaca manusia:

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

Untuk diproses lebih lanjut:

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

Untuk memastikan skrip berjalan dengan persyaratan versi minimal dari juru bahasa Python, tambahkan ini ke kode Anda:

assert sys.version_info >= (2, 5)

Ini membandingkan informasi versi mayor dan minor. Menambahkan mikro (= 0, 1, dll) dan bahkan releaselevel (= 'alpha', 'final', dll) untuk tupel yang Anda suka. Namun perlu dicatat, bahwa hampir selalu lebih baik untuk "mengecek" memeriksa apakah fitur tertentu ada di sana, dan jika tidak, solusi (atau bail out). Terkadang fitur hilang dalam rilis yang lebih baru, digantikan oleh yang lain.

krawyoti
sumber
39
sebenarnya sintaks untuk cetak. bukan untuk memeriksa versi. saya menggunakannya dalam skrip python 2 dan 3 saya:PY3 = sys.version_info[0] == 3
gcb
5
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz
25
Anda juga dapat mengakses beberapa bidang sys.version_infosebagai properti, jadi PY3 = sys.version_info.major == 3mungkin sedikit lebih menarik.
krs013
1
Catatan: sys.hexversion dibandingkan dengan 0x020502F0, lihat docs.python.org/2/library/sys.html#sys.hexversion
Yinon Ehrlich
1
@ gcb cuplikan kode Anda akan pecah kapan pun Python 4 terjadi. Anda harus melakukannya if sys.version_info >= (3,). Ini benar-benar pythonic untuk membandingkan berbagai ukuran tupel dan itu akan melakukan hal yang benar.
Boris
374

Dari baris perintah (perhatikan ibukota 'V'):

python -V

Ini didokumentasikan dalam 'man python'.

jcolino
sumber
13
Modal V versi, bukan huruf kecil
Rogue
96

Saya suka sys.hexversionhal-hal seperti ini.

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

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
brianz
sumber
Itu fitur versi bagus yang belum pernah saya lihat, dan sedikit lebih mudah digunakan (setidaknya bagi saya) daripada versi biasa ...
Wayne Werner
6
@sorin: dapatkah Anda menjelaskan bagaimana ini lebih baik daripada misalnya jawaban Seth Karena Anda menyatakan ini adalah yang terbaik, saya bertanya-tanya.
0xC0000022L
3
@ 0xC0000022L Pernahkah Anda bertanya-tanya bagaimana Anda dapat membandingkan teks dari tuple? Bagaimana 'final' dibandingkan dengan beta, rc, atau apa pun itu bisa ada di sana. Alih-alih jika Anda memiliki nilai numerik, Anda akan selalu dapat menentukan versi yang tepat.
sorin
1
@sorin: uhm, itu tidak masalah, kan? Jika saya membandingkan dengan (2,6,4)yang 'final'tampaknya tidak mempengaruhi perbandingan dan itu tidak seharusnya. Rupanya tidak diperlukan pengirisan ketika saya membandingkan bagian "paling penting" dari tuple. Sepertinya ini cara perawatannya dan itulah pertanyaan saya. Saya tidak mengatakan solusi ini tidak memiliki manfaatnya, saya hanya bertanya-tanya mengapa ini yang terbaik - yaitu apa yang saya lewatkan.
0xC0000022L
11
Level rilis didefinisikan sebagai salah satu dari 'alpha', 'beta', 'kandidat', atau 'final' yang juga akan dibandingkan dengan benar ...
Fredrik
65

Taruhan terbaik Anda mungkin kira-kira seperti ini:

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

Selain itu, Anda selalu dapat membungkus impor Anda dengan percobaan sederhana, yang seharusnya menangkap kesalahan sintaksis. Dan, untuk titik @ Heikki, kode ini akan kompatibel dengan versi python yang jauh lebih tua:

>>> try:
...     from my_module import twoPointSixCode
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>
Seth
sumber
3
Mengapa Pengecualian dan bukan ImportError? : P
mematikan
4
@deadly - ImportError tidak akan menangkap SyntaxErrors, yang akan dilemparkan jika Anda mencoba menggunakan sintaks baru dalam python lama, seperti mencoba menggunakan pintasan bersyarat di pra-2.5.
Seth
except Exceptionterlalu luas. Bukankah lebih baik menggunakan pengecualian khusus yang Anda harapkan?
Fermi paradox
1
@Fermiparadox - Menjadi luas membuat asumsi tetap rendah. The except Exception:garis dengan sendirinya sudah mengasumsikan modern (2.x +) python. Mungkin beberapa python masa depan akan mengatur ulang nama pengecualian dalam beberapa cara yang tidak kompatibel ke belakang? (Mungkin tidak, tapi siapa yang tahu seperti apa bentuk python dalam 20 tahun ketika kita semua memiliki implan bola mata oculus rift? Kode bertahan lama.)
Seth
65

Gunakan platform'spython_version dari stdlib tersebut:

>>> from platform import python_version
>>> print(python_version())
2.7.8
Tagihan
sumber
5
Untuk fungsi cetak, akan lebih baik dalam tanda kurung, pikirkan kompatibilitas. Jika seseorang menggunakan sampel dalam versi 3, kesalahan sintaks akan ada di sana menunggu.
Alex Chiang
47

Letakkan sesuatu seperti:

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

di bagian atas skrip Anda.

Perhatikan bahwa tergantung pada apa lagi yang ada di skrip Anda, versi python yang lebih lama dari target mungkin tidak dapat memuat skrip, jadi tidak akan cukup jauh untuk melaporkan kesalahan ini. Sebagai solusinya, Anda bisa menjalankan di atas dalam skrip yang mengimpor skrip dengan kode yang lebih modern.

rjmunro
sumber
6
Ini tidak benar (atau setidaknya, tidak lengkap) karena penafsir lama akan muntah pada konstruksi bahasa yang lebih baru seperti x if Pred() else y. Mereka akan mati selama fase "lexing", dan tidak pernah memiliki kesempatan untuk benar - benar mengeksekusiexit(1) . Jawaban Seth benar dalam merangkum fitur bahasa baru di file lain.
Mark Rushakoff
2
@MarkRushakoff: komentar Anda membingungkan. Aspek mana dari jawaban ini yang salah? elseCabang yang hilang atau yang <digunakan untuk version_info? AFAIK Python memberikan nilai yang hilang dalam tupel, dan semua ini harus valid sebelum 2.6, bukan? Jadi jawaban Seth menggunakan pengirisan (berlebihan) sementara yang ini tidak dan itu membuat komentar Anda lebih membingungkan.
0xC0000022L
5
Saya pikir apa yang dikatakan @MarkRushakoff adalah bahwa jika Anda memiliki ini di bagian atas file, dan fitur bahasa baru di tempat lain dalam file yang sama, versi lama python akan mati ketika memuat file, sebelum menjalankannya, jadi kesalahan tidak akan ditampilkan. Pada dasarnya Anda harus meletakkan tanda di atas (atau tanda centang lain) di bagian atas file, lalu mengimpor kode yang memerlukan versi python baru dari file yang terpisah.
rjmunro
1
Yap, apa yang dikatakan @rjmunro :)
Mark Rushakoff
25

Berikut versi perintah singkat yang langsung keluar (berguna untuk skrip dan eksekusi otomatis):

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

Atau hanya mayor, minor, dan 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)
Wolph
sumber
1
@ navigilancer Anda benar, pada saat penulisan ini belum relevan, tetapi saya telah memperbaruinya untuk Python 3 sekarang :)
Wolph
Bagus, ini menyelesaikan masalah saya di mana saya mendapatkan nomor versi dengan menangkap output dari python2 --versiondan python3 --versiondari PHP. Sementara saya akan mendapatkan yang terakhir tanpa masalah melalui passthru(), yang pertama hanya akan mencetak ke layar tetapi tidak pernah ditangkap, bahkan ketika diarahkan ke file ...
Tox
1
@tox Anda dapat meminta print() untuk menulis ke file jika itu lebih mudah.
Wolph
Dalam kasus saya itu akan lebih sama dengan saya sudah mengarahkan passthru()output ke file. Solusi Anda melakukan apa yang saya butuhkan. :)
Tox
14

Dengan sixmodul, Anda dapat melakukannya dengan:

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x
Dzhuang
sumber
8
import sys
sys.version.split(' ')[0]

sys.version memberi Anda apa yang Anda inginkan, cukup pilih nomor pertama :)

fengshaun
sumber
5

Cara paling sederhana

Cukup ketik python di terminal Anda dan Anda dapat melihat versi seperti berikut

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.
>>> 
cjahangir
sumber
23
"Cara paling sederhana" ... untuk melakukan sesuatu yang berbeda dari yang diminta.
Luc
4

Seperti yang dikatakan Seth, skrip utama dapat memeriksa sys.version_info(tetapi perhatikan bahwa itu tidak muncul hingga 2.0, jadi jika Anda ingin mendukung versi yang lebih lama Anda perlu memeriksa properti versi lain dari modul sys).

Tetapi Anda masih perlu berhati-hati untuk tidak menggunakan fitur bahasa Python dalam file yang tidak tersedia di versi Python yang lebih lama. Misalnya, ini diizinkan dalam Python 2.5 dan yang lebih baru:

try:
    pass
except:
    pass
finally:
    pass

tetapi tidak akan berfungsi di versi Python yang lebih lama, karena Anda hanya bisa memiliki kecuali ATAU akhirnya cocok dengan coba. Jadi untuk kompatibilitas dengan versi Python lama Anda perlu menulis:

try:
    try:
        pass
    except:
        pass
finally:
    pass
Heikki Toivonen
sumber
2

Beberapa jawaban sudah menyarankan cara melakukan query versi python saat ini. Untuk memeriksa secara terprogram persyaratan versi, saya akan menggunakan salah satu dari dua metode berikut:

# 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")
normanius
sumber
2

Hanya untuk bersenang-senang, berikut ini adalah cara melakukannya di CPython 1.0-3.7b2, Pypy, Jython, dan Micropython. Ini lebih merupakan keingintahuan daripada cara melakukannya dalam kode modern. Saya menulisnya sebagai bagian dari http://stromberg.dnsalias.org/~strombrg/pythons/ , yang merupakan skrip untuk menguji potongan kode pada banyak versi python sekaligus, sehingga Anda dapat dengan mudah merasakan apa itu python fitur-fitur yang kompatibel dengan versi 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")
dstromberg
sumber
2

Periksa versi Python: python -Vatau python --versionatauapt-cache policy python

Anda juga dapat menjalankan whereis pythonuntuk melihat berapa banyak versi yang diinstal.

Shusen Yi
sumber
3
Jawaban yang sama sudah diposting. dan, pertanyaannya bukan "Bagaimana cara memeriksa versi python yang telah saya instal?" tetapi "Bagaimana cara memeriksa versi dalam skrip saya".
Stanley Kou
2

Jika Anda ingin mendeteksi pra-Python 3 dan tidak ingin mengimpor apa pun ...

... Anda dapat (ab) menggunakan perubahan scoping pemahaman daftar dan melakukannya dalam satu ekspresi :

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

Untuk memverifikasi versi Python untuk perintah pada Windows, jalankan perintah berikut dalam prompt perintah dan verifikasi output

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

Juga, Untuk melihat konfigurasi folder untuk setiap versi Python, jalankan perintah berikut:

For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
Aamir M Meman
sumber
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}")

keluaran

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
oetzi
sumber
Untuk Python 2.7, kita harus menggunakan print("sys.version: {}".format(version)).
Marco
@ Marsco, benar. pemformatan string dilakukan untuk v 3+ dengan argumen kata kunci. dapat dilakukan sebagai format cetak ('[{}, {}, {}]' (1,2,3)) untuk python 2,7 ref: stackoverflow.com/questions/517355/string-formatting-in-python
oetzi
1

sys.version_infosepertinya tidak mengembalikan a tuplepada 3.7. Sebaliknya, ia mengembalikan kelas khusus, jadi semua contoh menggunakan tuple tidak berfungsi, setidaknya bagi saya. Inilah output dari konsol python:

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

Saya telah menemukan bahwa menggunakan kombinasi sys.version_info.majordan sys.version_info.minorsepertinya cukup. Sebagai contoh,...

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

memeriksa apakah Anda menjalankan Python 3. Anda bahkan dapat memeriksa versi yang lebih spesifik dengan ...

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)

dapat memeriksa untuk melihat apakah Anda menjalankan setidaknya Python 3.5.

Parker E.
sumber
Ini seperti subkelas namedtupledan membandingkannya dengan tuple yang pasti berfungsi. Untuk mendapatkan kesetaraan penuh, Anda memerlukan pengetikan lima elemen: mayor, minor, mikro, releaselevel (string) dan serial.
Mikhail Edoshin
0

Cara paling sederhana yang lebih sederhana:

Di Spyder, mulai "Konsol IPython" baru, lalu jalankan skrip yang ada.

Sekarang versi dapat dilihat pada output pertama yang dicetak di jendela konsol:

"Python 3.7.3 (default, 24 Apr 2019, 15:29:51) ..."

masukkan deskripsi gambar di sini

S. Jessen
sumber
0

Untuk memeriksa dari baris perintah, dalam satu perintah tunggal, tetapi termasuk mayor, minor, versi mikro, releaselevel dan serial :

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

3.7.6-final-0

Catatan: .format()alih-alih f-string atau '.'.join()memungkinkan Anda untuk menggunakan pemformatan dan karakter pemisah yang sewenang-wenang, misalnya untuk menjadikannya string satu kata yang dapat diterima. Saya memasukkan ini ke dalam skrip bash utility yang melaporkan semua versi penting: python, numpy, panda, sklearn, MacOS, xcode, dentang, brew, conda, anaconda, gcc / g ++ dll. Berguna untuk logging, replikasi, troubleshootingm bug-reporting dll .

smci
sumber
-1

Jika Anda bekerja di linux cukup beri perintah python output akan seperti ini

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

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

Ketik "bantuan", "hak cipta", "kredit" atau "lisensi" untuk informasi lebih lanjut.

pkm
sumber
5
Saya ingin skrip python saya dapat memperoleh versi python yang menafsirkannya. Jawaban yang benar telah diterima.
operator
Tidak membantu untuk mendapatkan Pythonversi dalam skrip, juga jawaban serupa sudah diposting sebelumnya: stackoverflow.com/a/35294211/950762
Akif