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,Jul312008,17:28:52)[GCC 4.2.3(Ubuntu4.2.3-2ubuntu7)]
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.
@ 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.
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)>>>ifnot 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
...exceptException:...print"can't import, probably because your python is too old!">>>
@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.)
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/pythonimport 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.
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):
@ 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.xelse:# six.PY3# this is python3.x
"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:passexcept:passfinally: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:
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 importStrictVersionassert(StrictVersion(platform.python_version())>="2.6")
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 =0try:import platform
except(ImportError,NameError):# We have no platform module - try to get the info via the sys module
check_sys =1ifnot check_sys:if hasattr(platform,"python_version"):
via_platform =1else:
check_sys =1if check_sys:try:import sys
test_sys =1except(ImportError,NameError):# just let via_sys_version_info and via_sys_version remain False - we have no sys modulepassif test_sys:if hasattr(sys,"version_info"):
via_sys_version_info =1elif hasattr(sys,"version"):
via_sys_version =1else:# just let via_sys remain Falsepassif 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")
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]]andNoneor x)(True)
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:
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:
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 .
python_version = int(str(range(3))[-2])
Jawaban:
Informasi ini tersedia di string sys.version dalam modul sys :
Dapat dibaca manusia:
Untuk diproses lebih lanjut:
Untuk memastikan skrip berjalan dengan persyaratan versi minimal dari juru bahasa Python, tambahkan ini ke kode Anda:
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.sumber
PY3 = sys.version_info[0] == 3
sys.version_info
sebagai properti, jadiPY3 = sys.version_info.major == 3
mungkin sedikit lebih menarik.if sys.version_info >= (3,)
. Ini benar-benar pythonic untuk membandingkan berbagai ukuran tupel dan itu akan melakukan hal yang benar.Dari baris perintah (perhatikan ibukota 'V'):
Ini didokumentasikan dalam 'man python'.
sumber
Saya suka
sys.hexversion
hal-hal seperti ini.http://docs.python.org/library/sys.html#sys.hexversion
sumber
(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.Taruhan terbaik Anda mungkin kira-kira seperti ini:
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:
sumber
except Exception
terlalu luas. Bukankah lebih baik menggunakan pengecualian khusus yang Anda harapkan?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.)Gunakan
platform
'spython_version
dari stdlib tersebut:sumber
Letakkan sesuatu seperti:
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.
sumber
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.else
Cabang yang hilang atau yang<
digunakan untukversion_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.Berikut versi perintah singkat yang langsung keluar (berguna untuk skrip dan eksekusi otomatis):
Atau hanya mayor, minor, dan mikro:
sumber
python2 --version
danpython3 --version
dari PHP. Sementara saya akan mendapatkan yang terakhir tanpa masalah melaluipassthru()
, yang pertama hanya akan mencetak ke layar tetapi tidak pernah ditangkap, bahkan ketika diarahkan ke file ...print()
untuk menulis ke file jika itu lebih mudah.passthru()
output ke file. Solusi Anda melakukan apa yang saya butuhkan. :)Dengan
six
modul, Anda dapat melakukannya dengan:sumber
sys.version memberi Anda apa yang Anda inginkan, cukup pilih nomor pertama :)
sumber
Cara paling sederhana
Cukup ketik python di terminal Anda dan Anda dapat melihat versi seperti berikut
sumber
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:
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:
sumber
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:
sumber
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:
sumber
Periksa versi Python:
python -V
ataupython --version
atauapt-cache policy python
Anda juga dapat menjalankan
whereis python
untuk melihat berapa banyak versi yang diinstal.sumber
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 :
sumber
Untuk memverifikasi versi Python untuk perintah pada Windows, jalankan perintah berikut dalam prompt perintah dan verifikasi output
Juga, Untuk melihat konfigurasi folder untuk setiap versi Python, jalankan perintah berikut:
sumber
keluaran
sumber
print("sys.version: {}".format(version))
.sys.version_info
sepertinya tidak mengembalikan atuple
pada 3.7. Sebaliknya, ia mengembalikan kelas khusus, jadi semua contoh menggunakan tuple tidak berfungsi, setidaknya bagi saya. Inilah output dari konsol python:Saya telah menemukan bahwa menggunakan kombinasi
sys.version_info.major
dansys.version_info.minor
sepertinya cukup. Sebagai contoh,...memeriksa apakah Anda menjalankan Python 3. Anda bahkan dapat memeriksa versi yang lebih spesifik dengan ...
dapat memeriksa untuk melihat apakah Anda menjalankan setidaknya Python 3.5.
sumber
namedtuple
dan membandingkannya dengan tuple yang pasti berfungsi. Untuk mendapatkan kesetaraan penuh, Anda memerlukan pengetikan lima elemen: mayor, minor, mikro, releaselevel (string) dan serial.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) ..."
sumber
Untuk memeriksa dari baris perintah, dalam satu perintah tunggal, tetapi termasuk mayor, minor, versi mikro, releaselevel dan serial :
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 .sumber
Jika Anda bekerja di linux cukup beri perintah
python
output akan seperti inisumber
Python
versi dalam skrip, juga jawaban serupa sudah diposting sebelumnya: stackoverflow.com/a/35294211/950762