Bagaimana saya bisa memeriksa versi apa dari Penafsir Python yang menafsirkan skrip saya?
python_version = int(str(range(3))[-2])
Bagaimana saya bisa memeriksa versi apa dari Penafsir Python yang menafsirkan skrip saya?
python_version = int(str(range(3))[-2])
Jawaban:
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.
PY3 = sys.version_info[0] == 3
sys.version_info
sebagai properti, jadi PY3 = 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.
Saya suka sys.hexversion
hal-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
(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:
>>> 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!"
>>>
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:
>>> from platform import python_version
>>> print(python_version())
2.7.8
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.
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 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.
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)
python2 --version
dan python3 --version
dari 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 ...
print()
untuk menulis ke file jika itu lebih mudah.
passthru()
output ke file. Solusi Anda melakukan apa yang saya butuhkan. :)
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.
>>>
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
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")
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")
Periksa versi Python: python -V
atau python --version
atauapt-cache policy python
Anda juga dapat menjalankan whereis python
untuk melihat berapa banyak versi yang diinstal.
... 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)
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'
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
print("sys.version: {}".format(version))
.
sys.version_info
sepertinya tidak mengembalikan a tuple
pada 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.major
dan sys.version_info.minor
sepertinya 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.
namedtuple
dan membandingkannya dengan tuple yang pasti berfungsi. Untuk mendapatkan kesetaraan penuh, Anda memerlukan pengetikan lima elemen: mayor, minor, mikro, releaselevel (string) dan serial.
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 .
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.
Python
versi dalam skrip, juga jawaban serupa sudah diposting sebelumnya: stackoverflow.com/a/35294211/950762