2010-09-21 40 views
7

Tôi có một kịch bản Python sử dụng Python phiên bản 2,6 cú pháp (Trừ lỗi như giá trị :) mà phiên bản 2.5 phàn nàn về. Vì vậy, trong kịch bản của tôi, tôi đã bao gồm một số mã để kiểm tra phiên bản trình thông dịch Python trước khi tiếp tục để người dùng không bị trúng một lỗi khó chịu, tuy nhiên, bất kể tôi đặt mã ở đâu, nó không hoạt động. Một khi nó chạm cú pháp lạ nó ném lỗi cú pháp, bỏ qua bất kỳ nỗ lực nào của tôi trong việc kiểm tra phiên bản.Kiểm tra Phiên bản của Python Interpreter Khi Thi hành Script Với ​​không hợp lệ Cú pháp

Tôi biết tôi chỉ đơn giản có thể đặt một khối thử/ngoại trừ khu vực mà cú pháp SyntaxError xuất hiện và tạo ra thông báo ở đó nhưng tôi tự hỏi nếu có một cách "thanh lịch" hơn. Vì tôi không phải là rất quan tâm đến việc đặt thử/ngoại trừ các khối trên mã của tôi để giải quyết vấn đề phiên bản. Tôi đã xem xét sử dụng tệp __ init__.py nhưng người dùng sẽ không nhập/sử dụng mã của tôi làm gói, vì vậy tôi không nghĩ rằng tuyến đường đó sẽ hoạt động, trừ khi tôi bị thiếu ...

đây là phiên bản mã kiểm tra của tôi:

import sys 
def isPythonVersion(version): 
    if float(sys.version[:3]) >= version: 
     return True 
    else: 
     return False 

if not isPythonVersion(2.6): 
    print "You are running Python version", sys.version[:3], ", version 2.6 or 2.7 is required. Please update. Aborting..." 
    exit() 

Trả lời

7

Tạo tập lệnh trình bao bọc để kiểm tra phiên bản và gọi tập lệnh thực của bạn - điều này cho bạn cơ hội kiểm tra phiên bản trước khi trình thông dịch thử kiểm tra cú pháp của tập lệnh thực.

+0

Đúng, điều này đã làm được điều này. Cảm ơn! – Stunner

+1

Điều này không cần thiết phải không? –

+2

Làm thế nào là không cần thiết? Toàn bộ mô-đun được kiểm tra cú pháp trước khi một dòng mã được chạy, vì vậy không thể bắt SyntaxError hoặc thực hiện kiểm tra phiên bản trước khi quá muộn mà không có tập lệnh trình bao bọc. – javawizard

3

trong sys.version_info bạn sẽ tìm thấy thông tin phiên bản lưu trữ trong một tuple:

sys.version_info 
(2, 6, 6, 'final', 0) 

Bây giờ bạn có thể so sánh:

def isPythonVersion(version): 
    return version >= sys.version_info[0] + sys.version_info[1]/10. 
+0

Cảm ơn nhưng tôi đã có phương pháp kiểm tra điều này, được hiển thị ở trên. – Stunner

+0

Điều này sẽ không đáng tin cậy, vì bộ phận hoạt động khác nhau giữa 2 và 3, Ví dụ 2.6 sẽ không bằng 2 + (6/10). 2 + (6/10) = 2.0 –

0

Nếu tốc độ không phải là ưu tiên, bạn có thể tránh hoàn toàn sự cố này bằng cách sử dụng sys.exc_info để lấy chi tiết về ngoại lệ cuối cùng.

7

Điều gì đó giống như thế này khi bắt đầu mã?

import sys 
if sys.version_info<(2,6): 
    raise SystemExit('Sorry, this code need Python 2.6 or higher') 
+0

Sử dụng một cái gì đó với điều này, đó là những gì sys.version_info tồn tại cho. –

+3

Tôi đã có một vấn đề tương tự và cũng đã thử phương pháp này, nhưng, thật không may, lừa này không hoạt động trong trường hợp mã sử dụng cú pháp không tương thích với phiên bản python đang chạy. Điều này là do thông dịch viên kiểm tra cú pháp mã của bạn trước khi biên dịch/chạy nó. Vì vậy, câu lệnh "if ..." sẽ không bao giờ được chạy nếu, ví dụ, bạn có một số câu lệnh ở đâu đó trong mã của bạn không tương thích với phiên bản hiện tại của python (ví dụ, print (..., file = sys. stderr), trong đó từ khóa 'tệp' không tương thích với python cũ hơn. – JJC

Các vấn đề liên quan