Làm cách nào để kiểm tra phiên bản Python nào đang chạy tập lệnh của tôi?


1185

Làm cách nào tôi có thể kiểm tra phiên bản Trình thông dịch Python nào đang diễn giải tập lệnh của tôi?


1
Chủ đề hiện tại là về việc kiểm tra phiên bản python từ một chương trình / kịch bản python. Trong trường hợp bạn đang muốn kiểm tra phiên bản trình thông dịch python được cài đặt trên máy của bạn từ dòng lệnh thì hãy tham khảo bài viết sau - Tôi đã cài đặt phiên bản Python nào?
RBT

1
đây là một cách thú vị để tách trăn 3 và 2 ...python_version = int(str(range(3))[-2])
Chris_Rands

@RBT: để kiểm tra một dòng từ dòng lệnh, xem câu trả lời của tôi .
smci

Câu trả lời:


1378

Thông tin này có sẵn trong chuỗi sys.version trong mô-đun sys :

>>> import sys

Con người có thể đọc được:

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

Để xử lý thêm:

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

Để đảm bảo tập lệnh chạy với yêu cầu phiên bản tối thiểu của trình thông dịch Python, hãy thêm đoạn mã này vào mã của bạn:

assert sys.version_info >= (2, 5)

Điều này so sánh thông tin phiên bản lớn và nhỏ. Thêm vi (= 0, 1, vv) và thậm chí releaselevel (= 'alpha', 'final', vv) để các tuple như bạn như thế nào. Tuy nhiên, lưu ý rằng hầu như luôn luôn tốt hơn để kiểm tra "vịt" nếu có một tính năng nhất định, và nếu không, giải pháp thay thế (hoặc giải cứu). Đôi khi các tính năng biến mất trong các bản phát hành mới hơn, được thay thế bởi những người khác.


39
Đó thực sự là cú pháp để in. không phải để kiểm tra phiên bản. tôi sử dụng nó trong kịch bản 2 và 3 python của tôi:PY3 = sys.version_info[0] == 3
gcb

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

25
Bạn cũng có thể truy cập một số trường trong sys.version_infocác thuộc tính, vì vậy PY3 = sys.version_info.major == 3có thể hấp dẫn hơn một chút.
krs013

1
Lưu ý: sys.hexversion được so sánh với 0x020502F0, xem docs.python.org/2/library/sys.html#sys.hexversion
Yinon Ehrlich

1
@gcb Đoạn mã của bạn sẽ bị hỏng bất cứ khi nào Python 4 xảy ra. Bạn nên làm if sys.version_info >= (3,). Đó là hoàn toàn pythonic để so sánh các bộ dữ liệu kích thước khác nhau và nó sẽ làm điều đúng đắn.
Boris

374

Từ dòng lệnh (lưu ý viết hoa 'V'):

python -V

Điều này được ghi lại trong 'người đàn ông trăn'.


13
chữ V là phiên bản, không phải chữ thường
Rogue

96

Tôi thích sys.hexversionnhững thứ như thế này.

http://docs.python.org/l Library / sys.html # sys.hexversion

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

Đó là một tính năng phiên bản tiện lợi mà tôi chưa từng thấy và dễ sử dụng hơn (ít nhất là với tôi) so với phiên bản thông thường ...
Wayne Werner

6
@sorin: bạn có thể giải thích làm thế nào điều này tốt hơn ví dụ câu trả lời của Seth không? Vì bạn nói đây là điều tốt nhất, tôi tự hỏi.
0xC0000022L

3
@ 0xC0000022L Bạn đã bao giờ tự hỏi làm thế nào bạn có thể so sánh văn bản từ bộ dữ liệu chưa? Làm thế nào 'cuối cùng' so sánh với beta, RC, hoặc bất cứ điều gì nó có thể ở đó. Thay vào đó nếu bạn có một giá trị số, bạn sẽ luôn có thể chỉ định một phiên bản chính xác.
sorin

1
@sorin: uhm, điều đó không chính xác, phải không? Nếu tôi so sánh với (2,6,4)những 'final'dường như không ảnh hưởng đến việc so sánh và nó không phải là nghĩa vụ phải. Rõ ràng không cần cắt lát khi tôi so sánh các phần "quan trọng nhất" của bộ dữ liệu. Đây dường như là cách nó được đối xử và đó là câu hỏi của tôi. Tôi không nói rằng giải pháp này không có giá trị của nó, tôi chỉ tự hỏi tại sao nó là tốt nhất - tức là những gì tôi đang thiếu.
0xC0000022L

11
Mức phát hành được xác định là một trong số 'alpha', 'beta', 'ứng cử viên' hoặc 'cuối cùng' cũng có thể được so sánh chính xác ...
Fredrik

65

Đặt cược tốt nhất của bạn có lẽ là một cái gì đó như vậy:

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

Ngoài ra, bạn luôn có thể gói nhập khẩu của mình trong một lần thử đơn giản, sẽ bắt lỗi cú pháp. Và, theo quan điểm của @ Heikki, mã này sẽ tương thích với các phiên bản cũ hơn của python:

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

3
Tại sao một Ngoại lệ đơn giản và không phải là Nhập khẩu? : P
chết người vào

4
@deadly - ImportError sẽ không bắt SyntaxErrors, nó sẽ bị ném nếu bạn cố sử dụng một cú pháp mới trong một con trăn cũ, chẳng hạn như cố gắng sử dụng phím tắt có điều kiện trong tiền 2.5.
Seth

except Exceptionquá rộng Sẽ không tốt hơn nếu sử dụng các ngoại lệ cụ thể mà bạn mong đợi?
Nghịch lý Fermi

1
@Fermiparadox - Là rộng rãi giữ cho các giả định thấp. Chính except Exception:dòng này đã giả định một con trăn (2.x +) hiện đại. Có thể một số con trăn trong tương lai sẽ sắp xếp lại các tên ngoại lệ theo một cách không tương thích ngược? (Có lẽ là không, nhưng ai biết con trăn sẽ trông như thế nào sau 20 năm nữa khi tất cả chúng ta đều cấy ghép nhãn cầu rạn nứt oculus? Mã kéo dài rất lâu.)
Seth

65

Sử dụng platformpython_version từ stdlib:

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

5
Đối với chức năng in, nó sẽ tốt hơn trong ngoặc đơn, nghĩ về khả năng tương thích. Nếu ai đó sử dụng mẫu trong phiên bản 3, lỗi cú pháp sẽ ở đó chờ.
Alex Chiang

47

Đặt một cái gì đó như:

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

ở đầu tập lệnh của bạn.

Lưu ý rằng tùy thuộc vào những gì khác trong tập lệnh của bạn, các phiên bản python cũ hơn mục tiêu có thể không tải được tập lệnh, vì vậy sẽ không đủ xa để báo cáo lỗi này. Như một giải pháp thay thế, bạn có thể chạy ở trên trong một tập lệnh nhập tập lệnh với mã hiện đại hơn.


6
Điều này không chính xác (hoặc ít nhất, không đầy đủ) vì các trình thông dịch cũ sẽ cấm các cấu trúc ngôn ngữ mới hơn như x if Pred() else y. Họ sẽ chết trong giai đoạn "lexing", và không bao giờ có cơ hội thực sự thực thi exit(1) . Câu trả lời của Seth là chính xác trong việc gói gọn các tính năng ngôn ngữ mới trong các tệp khác.
Mark Rushakoff

2
@MarkRushakoff: bình luận của bạn thật khó hiểu. Khía cạnh nào của câu trả lời này là sai? Các elsenhánh bị thiếu hoặc a <được sử dụng cho version_info? AFAIK Python đệm thiếu các giá trị trong bộ dữ liệu và tất cả những điều này sẽ hợp lệ trước 2.6, phải không? Vì vậy, câu trả lời của Seth sử dụng cắt lát (dư thừa) trong khi câu trả lời này không và điều đó làm cho nhận xét của bạn thậm chí còn khó hiểu hơn.
0xC0000022L

5
Tôi nghĩ điều mà @MarkRushakoff đang nói là nếu bạn có thứ này ở đầu tệp và một tính năng ngôn ngữ mới ở cùng một tệp, phiên bản cũ của python sẽ chết khi tải tệp, trước khi nó chạy bất kỳ tệp nào, Vì vậy, lỗi sẽ không được hiển thị. Về cơ bản, bạn phải đặt phần trên (hoặc một kiểm tra khác) ở đầu tệp, sau đó nhập mã yêu cầu phiên bản mới của python từ các tệp riêng biệt.
rjmunro

1
Đúng, những gì @rjmunro đã nói :)
Mark Rushakoff

25

Đây là một phiên bản dòng lệnh ngắn xuất hiện ngay lập tức (tiện dụng cho các tập lệnh và thực thi tự động):

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

Hoặc chỉ là chính, phụ và vi mô:

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 Bạn nói đúng, tại thời điểm viết nó chưa liên quan nhưng tôi đã cập nhật nó cho Python 3 ngay bây giờ :)
Wolph

Thật tuyệt, điều này giải quyết vấn đề của tôi khi tôi lấy số phiên bản bằng cách nắm bắt đầu ra python2 --versionpython3 --versiontừ PHP. Mặc dù tôi sẽ nhận được cái sau mà không gặp vấn đề gì passthru(), cái trước sẽ chỉ in ra màn hình chứ không bao giờ bị bắt, ngay cả khi được chuyển hướng vào một tệp ...
Tox

1
@tox Bạn có thể yêu print() cầu ghi vào một tệp nếu thuận tiện hơn.
Wolph

Trong trường hợp của tôi, nó sẽ giống với việc tôi đã chuyển hướng passthru()đầu ra sang một tệp. Giải pháp của bạn làm chính xác những gì tôi cần. :)
Tox

14

Với sixmô-đun, bạn có thể làm điều đó bằng cách:

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 cung cấp cho bạn những gì bạn muốn, chỉ cần chọn số đầu tiên :)


5

Cách đơn giản nhất

Chỉ cần gõ python trong thiết bị đầu cuối của bạn và bạn có thể thấy phiên bản như sau

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
"Cách đơn giản nhất" ... để làm một cái gì đó khác với những gì được yêu cầu.
Luc

4

Giống như Seth đã nói, tập lệnh chính có thể kiểm tra sys.version_info(nhưng lưu ý rằng nó không xuất hiện cho đến 2.0, vì vậy nếu bạn muốn hỗ trợ các phiên bản cũ hơn, bạn sẽ cần kiểm tra thuộc tính phiên bản khác của mô-đun sys).

Nhưng bạn vẫn cần lưu ý không sử dụng bất kỳ tính năng ngôn ngữ Python nào trong tệp không có sẵn trong các phiên bản Python cũ hơn. Ví dụ: điều này được cho phép trong Python 2.5 trở lên:

try:
    pass
except:
    pass
finally:
    pass

nhưng sẽ không hoạt động trong các phiên bản Python cũ hơn, bởi vì bạn chỉ có thể có ngoại trừ HOẶC cuối cùng phù hợp với thử. Vì vậy, để tương thích với các phiên bản Python cũ hơn, bạn cần viết:

try:
    try:
        pass
    except:
        pass
finally:
    pass

2

Một số câu trả lời đã gợi ý cách truy vấn phiên bản python hiện tại. Để kiểm tra các yêu cầu phiên bản theo chương trình, tôi sẽ sử dụng một trong hai phương pháp sau:

# 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

Chỉ để cho vui, sau đây là một cách thực hiện trên CPython 1.0-3.7b2, Pypy, Jython và Micropython. Đây là một sự tò mò hơn là một cách làm trong mã hiện đại. Tôi đã viết nó như là một phần của http://stromberg.dnsalias.org/~strombrg/pythons/ , đây là một đoạn script để kiểm tra một đoạn mã trên nhiều phiên bản của python, vì vậy bạn có thể dễ dàng cảm nhận được con trăn nào Các tính năng tương thích với phiên bản nào của 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")

2

Kiểm tra phiên bản Python: python -Vhoặc python --versionhoặcapt-cache policy python

bạn cũng có thể chạy whereis pythonđể xem có bao nhiêu phiên bản được cài đặt.


3
Câu trả lời tương tự đã được đăng. và, Câu hỏi không phải là "Làm cách nào để kiểm tra phiên bản python nào tôi đã cài đặt?" nhưng "Làm cách nào để kiểm tra phiên bản trong tập lệnh của tôi".
Stanley Kou

2

Nếu bạn muốn phát hiện tiền Python 3 và không muốn nhập bất cứ thứ gì ...

... bạn có thể (ab) sử dụng các thay đổi phạm vi hiểu danh sách và thực hiện nó trong một biểu thức duy nhất :

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

2

Để xác minh phiên bản Python cho các lệnh trên Windows, hãy chạy các lệnh sau trong dấu nhắc lệnh và xác minh đầu ra

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

Ngoài ra, để xem cấu hình thư mục cho từng phiên bản Python, hãy chạy các lệnh sau:

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

đầu ra

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

Đối với Python 2.7, chúng ta phải sử dụng print("sys.version: {}".format(version)).
Marco

@Marco, phải rồi. định dạng chuỗi được thực hiện cho v 3+ với các đối số từ khóa. có thể được thực hiện dưới dạng in ('[{}, {}, {}]'. format (1,2,3)) cho python 2.7 ref: stackoverflow.com/questions/517355/opes-formatted-in-python
oetzi

1

sys.version_infodường như không trả về một tupleđiểm nào trong 3.7. Thay vào đó, nó trả về một lớp đặc biệt, vì vậy, tất cả các ví dụ sử dụng bộ dữ liệu không hoạt động, đối với tôi ít nhất. Đây là đầu ra từ bàn điều khiển python:

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

Tôi đã thấy rằng sử dụng kết hợp sys.version_info.majorsys.version_info.minordường như là đủ. Ví dụ,...

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

kiểm tra xem bạn có đang chạy Python 3. Thậm chí bạn có thể kiểm tra các phiên bản cụ thể hơn với ...

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)

có thể kiểm tra xem bạn có đang chạy ít nhất Python 3.5 không.


Nó giống như một lớp con namedtuplevà so sánh nó với tuple chắc chắn hoạt động. Để có được sự bình đẳng đầy đủ, bạn cần có một nhóm gồm năm yếu tố: chính, phụ, vi mô, phát hành lại (chuỗi) và nối tiếp.
Mikhail Edoshin

0

Cách thậm chí đơn giản hơn:

Trong Spyder, bắt đầu một "Bảng điều khiển IPython" mới, sau đó chạy bất kỳ tập lệnh hiện có nào của bạn.

Bây giờ phiên bản có thể được nhìn thấy trong đầu ra đầu tiên được in trong cửa sổ giao diện điều khiển:

"Python 3.7.3 (mặc định, ngày 24 tháng 4 năm 2019, 15:29:51) ..."

nhập mô tả hình ảnh ở đây


0

Để kiểm tra từ dòng lệnh, trong một lệnh duy nhất, nhưng bao gồm phiên bản chính, phụ, phiên bản vi mô, bản phát hành lại và nối tiếp :

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

3.7.6-final-0

Lưu ý: .format()thay vì chuỗi f hoặc '.'.join()cho phép bạn sử dụng định dạng ký tự và ký tự phân tách tùy ý, ví dụ: để biến đây thành chuỗi một từ có thể greppable. Tôi đặt đoạn mã này trong tập lệnh tiện ích bash báo cáo tất cả các phiên bản quan trọng: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++, v.v. .


-1

Nếu bạn đang làm việc trên linux, chỉ cần đưa python ra đầu ra lệnh sẽ như thế này

Python 2.4.3 (# 1, ngày 11 tháng 6 năm 2009, 14:09:37)

[GCC 4.1.2 20080704 (Mũ đỏ 4.1.2-44)] trên linux2

Nhập "trợ giúp", "bản quyền", "tín dụng" hoặc "giấy phép" để biết thêm thông tin.


5
Tôi muốn kịch bản python của tôi có thể có được phiên bản python đang diễn giải nó. Câu trả lời đúng đã được chấp nhận.
tàu sân bay

Điều này không giúp lấy Pythonphiên bản trong tập lệnh, câu trả lời tương tự cũng đã được đăng trước đó: stackoverflow.com/a353294211/950762
Akif
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.