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?
python_version = int(str(range(3))[-2])
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?
python_version = int(str(range(3))[-2])
Câu trả lời:
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.
PY3 = sys.version_info[0] == 3
sys.version_info
các thuộc tính, vì vậy PY3 = sys.version_info.major == 3
có thể hấp dẫn hơn một chút.
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.
Tôi thích sys.hexversion
nhữ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
(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.
Đặ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!"
>>>
except Exception
quá 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?
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.)
Sử dụng platform
làpython_version
từ stdlib:
>>> from platform import python_version
>>> print(python_version())
2.7.8
Đặ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.
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.
else
nhá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.
Đâ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)
python2 --version
và python3 --version
từ 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 ...
print()
cầu ghi vào một tệp nếu thuận tiện hơn.
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. :)
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.
>>>
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
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")
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")
Kiểm tra phiên bản Python: python -V
hoặc python --version
hoặ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.
... 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)
Để 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'
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
print("sys.version: {}".format(version))
.
sys.version_info
dườ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.major
và sys.version_info.minor
dườ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.
namedtuple
và 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.
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) ..."
Để 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. .
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.
Python
phiê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