Làm cách nào tôi có thể kiểm tra phiên bản Python trong chương trình sử dụng các tính năng ngôn ngữ mới?


239

Nếu tôi có một tập lệnh Python yêu cầu ít nhất một phiên bản Python cụ thể, cách chính xác để thất bại một cách duyên dáng khi một phiên bản Python trước đó được sử dụng để khởi chạy tập lệnh là gì?

Làm cách nào để tôi có quyền kiểm soát đủ sớm để đưa ra thông báo lỗi và thoát?

Ví dụ: tôi có một chương trình sử dụng toán tử ternery (mới trong 2.5) và các khối "với" (mới trong 2.6). Tôi đã viết một thói quen kiểm tra phiên bản phiên dịch nhỏ đơn giản, đó là điều đầu tiên mà kịch bản sẽ gọi ... ngoại trừ nó không đi xa đến thế. Thay vào đó, tập lệnh thất bại trong quá trình biên dịch python, trước khi các thói quen của tôi thậm chí được gọi. Do đó, người sử dụng tập lệnh nhìn thấy một số tracebacks lỗi synax rất khó hiểu - điều mà khá nhiều yêu cầu một chuyên gia suy luận rằng đó chỉ đơn giản là trường hợp chạy phiên bản Python sai.

Tôi biết cách kiểm tra phiên bản Python. Vấn đề là một số cú pháp là bất hợp pháp trong các phiên bản cũ hơn của Python. Hãy xem xét chương trình này:

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

Khi chạy dưới 2.4, tôi muốn kết quả này

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

và không phải kết quả này:

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(Kênh cho đồng nghiệp.)


3
"kiểm tra phiên bản của python. Vấn đề là một số cú pháp là bất hợp pháp trong các phiên bản cũ hơn của python." Tôi không hiểu làm thế nào đây là một vấn đề. Nếu bạn có thể kiểm tra phiên bản, bạn có thể tránh được lỗi cú pháp. Làm thế nào để kiểm tra phiên bản không áp dụng cho cú pháp? Bạn có thể làm rõ câu hỏi của bạn?
S.Lott

4
@ S.Lott Không, bạn không sai, chỉ là khó khăn trong việc bao gồm mã ở đâu đó cũng sẽ không được đọc (phân tích cú pháp) cũng như không được thực thi - điều này không rõ ràng ngay lập tức như các câu trả lời hiển thị.
Brendan

7
S.Lott, bạn không thể thực hiện thử nghiệm của mình trong phiên bản cũ của python vì nó không được biên dịch. Thay vào đó, bạn nhận được một lỗi cú pháp chung. Hãy thử mã ví dụ với trình thông dịch 2.4 và bạn sẽ thấy rằng bạn không thể kiểm tra phiên bản.
Đánh dấu Harrison

7
@ S.Lott Nó phụ thuộc vào những gì bạn coi là tầm thường - cá nhân tôi sẽ không xem xét việc tạo các tệp riêng biệt cho các phiên bản khác nhau của Python hoặc sinh ra các quy trình bổ sung tầm thường. Tôi muốn nói rằng câu hỏi này rất có giá trị, đặc biệt là khi bạn cho rằng Python có rất nhiều mánh khóe gọn gàng và thường gây ngạc nhiên - Tôi đến đây từ Google muốn biết liệu có câu trả lời gọn gàng không
Brendan

7
Tôi nghĩ rằng chúng tôi đã kết thúc cuộc thảo luận này. Tôi đã hỏi một câu hỏi về điều gì đó mà tôi không biết phải làm như thế nào và nhận được câu trả lời cho tôi biết cách thực hiện. Tôi không đề xuất bất cứ điều gì, tôi chỉ chấp nhận câu trả lời của orip đang làm việc rất tốt cho tôi (thực ra là đồng nghiệp mà tôi đang kênh). Viva Le Stack tràn!
Đánh dấu Harrison

Câu trả lời:


111

Bạn có thể kiểm tra bằng cách sử dụng eval:

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

Ngoài ra, with có sẵn trong Python 2.5, chỉ cần thêm from __future__ import with_statement.

EDIT: để có đủ quyền kiểm soát sớm, bạn có thể chia nó thành các .pytệp khác nhau và kiểm tra tính tương thích trong tệp chính trước khi nhập (ví dụ: __init__.pytrong một gói):

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *

10
đây là một câu trả lời tuyệt vời vấn đề chính từ câu hỏi cần giải quyết là một chương trình phải chính xác về mặt cú pháp để phiên bản python đó bắt đầu thực thi, do đó sử dụng cú pháp mới ngăn chương trình bắt đầu trên các phiên bản cũ của trình thông dịch. eval hoạt động xung quanh đó
Autoplectic

7
Nếu gói đang được cài đặt bởi setuptools, thì việc biên dịch byte các tệp nguồn sẽ thất bại. Ngoài ra, tất cả các mâu thuẫn để tạo ra một thông báo lỗi thời gian chạy có vẻ hơi vô nghĩa - tại sao không chỉ ghi lại các yêu cầu và để nó ở đó?
John Machin

2
Lưu ý rằng nếu cố gắng kiểm tra một biểu thức, thay vì một câu lệnh đơn giản, bạn cần sử dụng execthay vì eval. Tôi đã có được điều này trong khi cố gắng viết một hàm sẽ in ra stderr trong cả py2k và py3k.
Xiong Chiamiov

2
Tôi nghĩ rằng một phiên bản sạch hơn của giải pháp này sẽ là đưa "kiểm tra" của bạn vào một mô-đun riêng biệt và nhập vào đó (bọc importtrạm trong thử / ngoại trừ). Lưu ý rằng bạn cũng có thể cần phải kiểm tra những thứ khác SyntaxError(ví dụ: các hàm dựng sẵn hoặc bổ sung vào thư viện chuẩn)
Steven

103

Có một trình bao bọc xung quanh chương trình của bạn mà làm như sau.

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

Bạn cũng có thể xem xét sử dụng sys.version(), nếu bạn có kế hoạch gặp những người đang sử dụng trình thông dịch Python trước 2.0, nhưng sau đó bạn có một số biểu thức thông thường để làm.

Và có thể có nhiều cách thanh lịch hơn để làm điều này.


7
FYI, "cur_version> = req_version" sẽ hoạt động như điều kiện.
orip

4
sys.version_infokhông phải là một chức năng.
nh2

3
Đặt mã bên trong thành công có điều kiện như thế là một thực tế khá tệ vì nó là một sự thụt lề không cần thiết và bổ sung logic. Chỉ cần làm một: if sys.version_info [: 2] <req_version: in "cũ"; sys.exit () - và nếu không thì tiếp tục như bình thường.
timss

1
Giống như Tim Peters nói trong "The Zen of Python": "Flat tốt hơn lồng nhau". (Bạn có thể thấy điều này bằng cách gõ "nhập cái này" bằng python)
Christopher Shroba

1
@ChristopherShroba Cảm ơn bạn đã import this. Một nghi thức đáng yêu.
Samuel Harmer

32

Thử

nền tảng nhập khẩu
platform.python_version ()

Sẽ cung cấp cho bạn một chuỗi như "2.3.1". Nếu đây không phải là chính xác bạn muốn có một bộ dữ liệu phong phú có sẵn thông qua tích hợp "nền tảng". Những gì bạn muốn nên ở trong đó một nơi nào đó.


4
-1: Điều này không hoạt động, như được giải thích trong câu hỏi cập nhật. Nếu bạn sử dụng bất kỳ cú pháp nào từ phiên bản Python mới hơn thì tệp của bạn sẽ không được biên dịch và nếu không biên dịch, nó không thể chạy và kiểm tra phiên bản!
Scott Griffiths

1
@ScottGriffiths Chạy print(platform.python_version())thay vì platform.python_version()!
Suriyaa

@ScottGriffiths Cũng kiểm tra câu trả lời của tôi: stackoverflow.com/a/40633458/5157221 .
Suriyaa

22

Có lẽ cách tốt nhất để làm so sánh phiên bản này là sử dụng sys.hexversion. Điều này rất quan trọng vì việc so sánh các bộ dữ liệu phiên bản sẽ không mang lại cho bạn kết quả mong muốn trong tất cả các phiên bản python.

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"

Tôi nghĩ rằng điều này là thanh lịch nhất, nhưng có lẽ không dễ hiểu nhất bởi các nhà phát triển khác.
Nick Bolton

5
Bạn có thể giải thích trong trường hợp nào so sánh các bộ tuple phiên bản sẽ không cho kết quả mong muốn không?
SpoonMeiser

bộ dữ liệu phiên bản cũng có thể chứa các giá trị chữ và số.
sorin

8
-1: Điều này không hoạt động, như được giải thích trong câu hỏi cập nhật. Nếu bạn sử dụng bất kỳ cú pháp nào từ phiên bản Python mới hơn thì tệp của bạn sẽ không được biên dịch và nếu không biên dịch, nó không thể chạy và kiểm tra phiên bản!
Scott Griffiths

Phiên bản / nền tảng nào không thành công?
sorin

15
import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")

7
Hãy nhận biết rằng trong Python 2.6 và dưới đây, sys.version_infokhông một tuple đặt tên. Bạn sẽ cần sử dụng sys.version_info[0]cho số phiên bản chính và sys.version_info[1]cho số phụ.
coredumperror

9

Trả lời từ Nykakin tại AskUbfox :

Bạn cũng có thể kiểm tra phiên bản Python từ chính mã bằng platformmô-đun từ thư viện chuẩn.

Có hai chức năng:

  • platform.python_version() (trả về chuỗi).
  • platform.python_version_tuple() (trả về tuple).

Mã Python

Tạo một tệp chẳng hạn version.py:)

Phương pháp dễ dàng để kiểm tra phiên bản:

import platform

print(platform.python_version())
print(platform.python_version_tuple())

Bạn cũng có thể sử dụng evalphương pháp:

try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

Chạy tệp Python trong một dòng lệnh:

$ python version.py 
2.7.11
('2', '7', '11')

Đầu ra của Python với CGI thông qua WAMP Server trên Windows 10:

Ảnh chụp màn hình 2016-11-16 14,39,01 bởi Suriyaa Kudo


Tài nguyên hữu ích


7

Các bộ đã trở thành một phần của ngôn ngữ cốt lõi trong Python 2.4, để luôn tương thích ngược. Tôi đã làm điều này sau đó, nó cũng sẽ làm việc cho bạn:

if sys.version_info < (2, 4):
    from sets import Set as set

3
Tốt hơn để kiểm tra tính năng thay vì phiên bản, phải không? try: set except NameError: from sets import Set as set
orip

@orip: Tại sao? Nếu bạn biết phiên bản nào một tính năng đã được giới thiệu, như các bộ ở đây, chỉ cần sử dụng mã ở trên. Không có gì sai với điều đó.
André

7

Mặc dù câu hỏi là: Làm thế nào để tôi có đủ quyền kiểm soát sớm để đưa ra thông báo lỗi và thoát ?

Câu hỏi mà tôi trả lời là: Làm thế nào để tôi có đủ quyền kiểm soát sớm để đưa ra thông báo lỗi trước khi khởi động ứng dụng ?

Tôi có thể trả lời nó rất nhiều khác nhau sau đó các bài viết khác. Có vẻ như câu trả lời cho đến nay đang cố gắng giải quyết câu hỏi của bạn từ bên trong Python.

Tôi nói, hãy kiểm tra phiên bản trước khi khởi chạy Python. Tôi thấy đường dẫn của bạn là Linux hoặc unix. Tuy nhiên tôi chỉ có thể cung cấp cho bạn một tập lệnh Windows. Tôi hình ảnh thích ứng nó với cú pháp kịch bản linux sẽ không quá khó.

Đây là kịch bản DOS với phiên bản 2.7:

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

Điều này không chạy bất kỳ phần nào trong ứng dụng của bạn và do đó sẽ không đưa ra Ngoại lệ Python. Nó không tạo bất kỳ tệp tạm thời hoặc thêm bất kỳ biến môi trường hệ điều hành. Và nó không kết thúc ứng dụng của bạn thành một ngoại lệ do các quy tắc cú pháp phiên bản khác nhau. Đó là ba điểm bảo mật ít khả năng truy cập hơn.

Các FOR /Fdòng là chìa khóa.

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

Đối với nhiều phiên bản python, hãy kiểm tra url: http://www.fpschultze.de/modules/smartfaq/faq.php?faqid=17

Và phiên bản hack của tôi:

[Tập lệnh MS; Phiên bản Python kiểm tra prelaunch của mô-đun Python] http://pastebin.com/aAuJ91FQ


Đối với những người bỏ phiếu xin đừng ngại giải thích lý do tại sao.
DevPlayer

Chính xác là tôi đang tìm kiếm. Cảm ơn! %% H là gì?
clocker

@Clocker python.exe -V sẽ trả về chuỗi "Python 2.7". Bảng điều khiển đặt chuỗi "Python" vào %% G và chuỗi "2.7" trong os var %% H được tạo tự động (chữ cái tiếp theo sau G). Tiếng vọng %% H | tìm "2.7" ống "2.7" vào lệnh DOS, tìm "2.7", đặt mức lỗi thành 1 nếu tìm thấy %% H trong "2.7". Mức lỗi đó, dẫn đến 1, từ việc sử dụng lệnh tìm DOS, sẽ cho phép chúng tôi phân nhánh thành nhãn lô DOS: Python27
DevPlayer

3
import sys
sys.version

sẽ nhận được câu trả lời như thế này

'2.7.6 (mặc định, ngày 26 tháng 10 năm 2016, 20:30:19) \ n [GCC 4.8.4]'

đây 2.7.6 là phiên bản


2

Như đã lưu ý ở trên, lỗi cú pháp xảy ra tại thời gian biên dịch, không phải lúc chạy. Mặc dù Python là "ngôn ngữ được dịch", mã Python không thực sự được diễn giải trực tiếp; nó được biên dịch thành mã byte, sau đó được giải thích. Có một bước biên dịch xảy ra khi một mô-đun được nhập (nếu không có phiên bản đã được biên dịch sẵn ở dạng tệp .pyc hoặc .pyd) và đó là khi bạn gặp lỗi, không (hoàn toàn chính xác) khi mã của bạn đang chạy.

Bạn có thể tắt bước biên dịch và thực hiện nó trong thời gian chạy cho một dòng mã, nếu bạn muốn, bằng cách sử dụng eval, như đã lưu ý ở trên, nhưng cá nhân tôi thích tránh làm điều đó, vì nó khiến Python thực hiện tiềm năng việc biên dịch thời gian chạy không cần thiết, đối với một điều, và đối với một điều khác, nó tạo ra những gì mà tôi cảm thấy như sự lộn xộn của mã. (Nếu bạn muốn, bạn có thể tạo mã tạo mã tạo mã - và có thời gian sửa đổi và gỡ lỗi hoàn toàn tuyệt vời trong 6 tháng kể từ bây giờ.) Vì vậy, những gì tôi muốn giới thiệu thay vào đó là như thế này:

import sys
if sys.hexversion < 0x02060000:
    from my_module_2_5 import thisFunc, thatFunc, theOtherFunc
else:
    from my_module import thisFunc, thatFunc, theOtherFunc

.. mà tôi sẽ làm ngay cả khi tôi chỉ có một hàm sử dụng cú pháp mới hơn và nó rất ngắn. (Trong thực tế tôi sẽ thực hiện mọi biện pháp hợp lý để giảm thiểu số lượng và kích thước của các hàm đó. Tôi thậm chí có thể viết một hàm như ifTrueAElseB (cond, a, b) với dòng cú pháp duy nhất trong đó.)

Một điều khác có thể đáng để chỉ ra (mà tôi hơi ngạc nhiên là chưa có ai chỉ ra) là trong khi các phiên bản trước đó của Python không hỗ trợ mã như

value = 'yes' if MyVarIsTrue else 'no'

.. nó đã hỗ trợ mã như

value = MyVarIsTrue and 'yes' or 'no'

Đó là cách viết cũ của biểu thức ternary. Tôi chưa cài đặt Python 3, nhưng theo tôi biết, cách "cũ" đó vẫn hoạt động cho đến ngày nay, vì vậy bạn có thể tự quyết định xem có nên sử dụng cú pháp mới một cách có điều kiện hay không, nếu bạn cần để hỗ trợ việc sử dụng các phiên bản cũ hơn của Python.


2
Nghiêm túc? Sao chép mã của bạn chỉ để bạn có thể thay đổi một số cấu trúc nhỏ? Kinh quá. Rất ngon. Và a and b or cthay vì b if a else c, nó không tương đương; nếu blà giả thì nó sẽ thất bại, sản xuất achứ không phải b.
Chris Morgan

1
Tôi không đề xuất mã trùng lặp, tôi đề nghị tạo các hàm bao cho mã cụ thể theo phiên bản, chữ ký của chúng không thay đổi giữa các phiên bản và đưa các chức năng đó vào các mô-đun dành riêng cho phiên bản. Tôi đang nói về các chức năng có thể dài từ 1 đến 5 dòng. Đúng là a và b hoặc c không giống với b nếu a khác c trong trường hợp b có thể đánh giá là sai. Vì vậy, tôi đoán ifAThenBElseC (a, b, c) trong common_ops_2_4.py, sẽ phải dài 2 hoặc 3 dòng thay vì 1. Phương thức này thực sự làm giảm tất cả mã của bạn bằng cách gói các thành ngữ phổ biến vào các hàm.
Shavais

2

Đặt phần sau vào phần trên cùng của tệp của bạn:

import sys

if float(sys.version.split()[0][:3]) < 2.7:
    print "Python 2.7 or higher required to run this code, " + sys.version.split()[0] + " detected, exiting."
    exit(1)

Sau đó tiếp tục với mã Python bình thường:

import ...
import ...
other code...

1
thay vì sử dụngsys.version_info < (2, 7)
Antti Haapala

@AnttiHaapala điều này là hoàn hảo đối với tôi, bạn có thể giải thích tại sao so sánh các sys.version_infoloại với một tuple hoạt động?
jjj

@jjj sys.version_info từng là một tuple; ví dụ (2, 4, 6, 'final', 0); Chỉ trong Python 3 và 2.7, nó đã được thay đổi thành một loại riêng biệt, tuy nhiên có thể so sánh với các bộ dữ liệu.
Antti Haapala

@AnttiHaapala Tôi thích cách tiếp cận đó tốt hơn của tôi ... cảm ơn!
jml

1

Tôi nghĩ cách tốt nhất là kiểm tra chức năng thay vì phiên bản. Trong một số trường hợp, điều này là tầm thường, không phải như vậy ở những người khác.

ví dụ:

try :
    # Do stuff
except : # Features weren't found.
    # Do stuff for older versions.

Miễn là bạn đủ cụ thể trong việc sử dụng các khối thử / ngoại trừ, bạn có thể bao quát hầu hết các cơ sở của mình.


2
Bạn đúng. Đó là những gì anh ấy đã hỏi cách thực hiện - đôi khi thử nghiệm các tính năng trong phiên bản Y thậm chí không biên dịch thành mã byte trong phiên bản X, vì vậy không thể thực hiện trực tiếp.
orip

1

Tôi chỉ tìm thấy câu hỏi này sau khi tìm kiếm nhanh trong khi cố gắng tự giải quyết vấn đề và tôi đã đưa ra một phép lai dựa trên một vài gợi ý ở trên.

Tôi thích ý tưởng sử dụng tập lệnh bao bọc của Devererer, nhưng nhược điểm là cuối cùng bạn vẫn duy trì nhiều trình bao bọc cho các hệ điều hành khác nhau, vì vậy tôi đã quyết định viết trình bao bọc bằng python, nhưng sử dụng cùng một phiên bản "lấy phiên bản" bằng cách chạy logic exe " và đã đưa ra điều này.

Tôi nghĩ rằng nó nên làm việc cho 2,5 trở đi. Tôi đã thử nghiệm nó trên 2.66, 2.7.0 và 3.1.2 trên Linux và 2.6.1 trên OS X cho đến nay.

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

Vâng, tôi biết dòng giải mã / dải cuối cùng là khủng khiếp, nhưng tôi chỉ muốn nhanh chóng lấy số phiên bản. Tôi sẽ tinh chỉnh điều đó.

Điều này hoạt động đủ tốt cho tôi bây giờ, nhưng nếu bất cứ ai có thể cải thiện nó (hoặc cho tôi biết tại sao đó là một ý tưởng khủng khiếp) thì cũng sẽ rất tuyệt.


1

Đối với các tập lệnh python độc lập , thủ thuật chuỗi mô-đun sau đây để thực thi phiên bản python (ở đây v2.7.x) hoạt động (được thử nghiệm trên * nix).

#!/bin/sh
''''python -V 2>&1 | grep -q 2.7 && exec python -u -- "$0" ${1+"$@"}; echo "python 2.7.x missing"; exit 1 # '''

import sys
[...]

Điều này sẽ xử lý thiếu python thực thi là tốt nhưng có một phụ thuộc vào grep. Xem ở đây cho nền.


0

Bạn có thể kiểm tra với sys.hexversionhoặc sys.version_info.

sys.hexversionkhông thân thiện với con người vì đó là số thập lục phân. sys.version_infolà một tuple, vì vậy nó thân thiện với con người hơn.

Kiểm tra Python 3.6 hoặc mới hơn với sys.hexversion:

import sys, time
if sys.hexversion < 0x30600F0:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

Kiểm tra Python 3.6 hoặc mới hơn với sys.version_info:

import sys, time
if sys.version_info[0] < 3 and sys.version_info[1] < 6:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

sys.version_infothân thiện với con người hơn, nhưng có nhiều nhân vật hơn. Tôi sẽ giới thiệu sys.hexversion, mặc dù nó ít thân thiện với con người.

Tôi hy vọng điều này đã giúp bạn!


0

Tôi đang mở rộng câu trả lời tuyệt vời của akhan, trong đó in một thông điệp hữu ích trước khi tập lệnh Python thậm chí được biên dịch.

Nếu bạn muốn đảm bảo rằng tập lệnh đang được chạy với Python 3.6 hoặc mới hơn, hãy thêm hai dòng này vào đầu tập lệnh Python của bạn:

#!/bin/sh
''''python3 -c 'import sys; sys.exit(sys.version_info < (3, 6))' && exec python3 -u -- "$0" ${1+"$@"}; echo 'This script requires Python 3.6 or newer.'; exit 1 # '''

(Lưu ý: Dòng thứ hai bắt đầu bằng bốn dấu ngoặc đơn và kết thúc bằng ba dấu ngoặc đơn. Điều này có thể trông lạ, nhưng nó không phải là một lỗi đánh máy.)

Ưu điểm của giải pháp này là mã như print(f'Hello, {name}!')sẽ không gây ra SyntaxErrornếu sử dụng phiên bản Python cũ hơn 3.6. Thay vào đó, bạn sẽ thấy thông báo hữu ích này:

This script requires Python 3.6 or newer.

Tất nhiên, giải pháp này chỉ hoạt động trên các shell giống Unix và chỉ khi tập lệnh được gọi trực tiếp (chẳng hạn như ./script.py:) và với các bit quyền eXecute thích hợp được đặt.


-2

Còn cái này thì sao:

import sys

def testPyVer(reqver):
  if float(sys.version[:3]) >= reqver:
    return 1
  else:
    return 0

#blah blah blah, more code

if testPyVer(3.0) == 1:
  #do stuff
else:
  #print python requirement, exit statement

5
-1: Điều này không hoạt động, như được giải thích trong câu hỏi cập nhật. Nếu bạn sử dụng bất kỳ cú pháp nào từ phiên bản Python mới hơn thì tệp của bạn sẽ không được biên dịch và nếu không biên dịch, nó không thể chạy và kiểm tra phiên bản!
Scott Griffiths

-3

Vấn đề khá đơn giản. Bạn đã kiểm tra xem phiên bản nhỏ hơn 2.4, không nhỏ hơn hoặc bằng . Vì vậy, nếu phiên bản Python là 2.4, thì nó không dưới 2.4. Những gì bạn nên có là:

    if sys.version_info **<=** (2, 4):

, không phải

    if sys.version_info < (2, 4):

4
đọc đoạn 3 và cập nhật. bạn không đến mức thực thi mã này vì mã của bạn sẽ không biên dịch trên 2.4 nếu bạn đang sử dụng các cấu trúc ngôn ngữ mới.
Mark Harrison

Ít hơn là tốt, chỉ thiếu eval.
Craig
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.