2012-06-30 11 views
29

私は大きなPython 2コードしか持っていません。 Python 3を最初にチェックし、python3を使用すると終了します。だから私は試しました:python 2 code:もしpython 3ならば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 

しかし、終了は起こりません。出力は次のとおりです。

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

だから、それはPythonのチェックのようなので、全体何かを実行する前に、コード、およびエラーを探します。

python2コードがpython3が使用されているかどうかをチェックする良い方法はありますか?

答えて

51

Pythonは、実行を開始する前にソースファイルをバイトコンパイルします。ファイル全体が少なくともの構文解析でなければなりません。そうでなければSyntaxErrorが得られます。

問題の最も簡単な解決策は、Python 2.xと3.xの両方として解析する小さなラッパーを作成することです。例:

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

ステートメントimport the_real_thingのみif文が実行されるので、このモジュールのコードはPythonの3.xのコードとして解析する必要はありません。

+0

'if __name__ ==" foo "'ブロックを使うこともできます。これは 'if __name__ ==" __main __ "'のように動作しますが、 'foo'をインポートすると実行します。 – inspectorG4dget

+2

もっと考えないでしょうか?Pythonic * EAFPを使用し、the_real_thingのインポートを 'try'ブロックの中に置くだけですか? – martineau

+1

@martineau:手元にある場合はこれをしません。 'import'はうまくいくかもしれませんし、' main() 'で他のエラーが起こるかもしれません。 'the_real_thing.main() 'をtry/exceptで囲むことは望ましくありません。 –

関連する問題