2012-06-30 42 views
29

Tôi có một phần lớn mã Python 2. Nó muốn kiểm tra Python 3 lúc đầu, và thoát ra nếu python3 được sử dụng. Vì vậy, tôi đã thử:python 2 code: nếu python 3 thì sys.exit()

import sys 

if sys.version_info >= (3,0): 
    print("Sorry, requires Python 2.x, not Python 3.x") 
    sys.exit(1) 

print "Here comes a lot of pure Python 2.x stuff ..." 
### a lot of python2 code, not just print statements follows 

Tuy nhiên, thoát không xảy ra. Đầu ra là:

$ python3 testing.py 
    File "testing.py", line 8 
     print "Here comes a lot of pure Python 2.x stuff ..." 
                 ^
SyntaxError: invalid syntax 

Vì vậy, nó trông giống như kiểm tra python các toàn mã trước khi thực hiện bất cứ điều gì, và do đó các lỗi.

Có cách nào tốt đẹp cho mã python2 để kiểm tra xem python3 có đang được sử dụng hay không, và nếu có in một cái gì đó thân thiện và sau đó thoát ra?

Trả lời

51

Python sẽ biên dịch tệp nguồn của bạn trước khi bắt đầu thực thi nó. Toàn bộ tệp phải có ít nhất phân tích cú pháp chính xác, nếu không bạn sẽ nhận được SyntaxError.

Giải pháp dễ nhất cho vấn đề của bạn là viết một trình bao bọc nhỏ phân tích cú pháp cả hai, Python 2.x và 3.x. Ví dụ:

import sys 
if sys.version_info >= (3, 0): 
    sys.stdout.write("Sorry, requires Python 2.x, not Python 3.x\n") 
    sys.exit(1) 

import the_real_thing 
if __name__ == "__main__": 
    the_real_thing.main() 

Tuyên bố import the_real_thing sẽ chỉ được thực hiện sau khi tuyên bố if, vì vậy các mã trong mô-đun này là không cần thiết để phân tích cú pháp như mã 3.x Python.

+0

Bạn cũng có thể sử dụng khối 'if __name__ ==" foo "', hoạt động giống như 'if __name__ ==" __main __ "' nhưng thực hiện khi 'foo' được nhập – inspectorG4dget

+2

Nó sẽ không được xem xét nhiều hơn * Pythonic * để sử dụng EAFP và chỉ cần nhập khẩu the_real_thing bên trong một khối 'try'? – martineau

+1

@martineau: Tôi sẽ không làm điều này trong trường hợp trong tầm tay. 'Import' có thể rất thành công, và các lỗi khác có thể xảy ra trong' main() '. Bạn không muốn kèm theo 'the_real_thing.main() ' trong thử/ngoại trừ. –

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