2016-07-11 3 views
0

バージョン2.6または2.7で動作するスクリプトを作成しました。私は別のバージョンがインストールされているかどうかを確認し、互換性のあるバージョンがあるかどうかを確認するための安全性チェックを行いました。ここに私のコードスニペットがあります。なぜPython 2.4は終了関数を無視し続けますか?

# !/usr/bin/python 

import sys, os, re 
from sys import exit 

if sys.version[0:3] in ['2.6', '2.7']: 
    import subprocess, datetime, os.path, json, urllib2, socket 

def python_version(): 

    version = sys.version[0:3] 

    while version not in ['2.6', '2.7']: 

     print '\n\nYou\'re using an incompatible version of Python (%s)' % version 

     python_installed_version = [] 

     for files in os.listdir("/usr/bin/"): # check to see version of python already on the box 

      python_version = re.search("(python2(.+?)[6-7]$)", files) 

      if python_version: 
       python_installed_version.append(python_version.group()) 

     if python_installed_version: 

      print 'Fortunately there are compatible version(s) installed. Try the following command(s): \n\n', 

      for version in python_installed_version: 
       print 'curl http://script.py | %s\n' % version 

     sys.exit() 

python_version() 

with p.stdout: 

print 'hello' 

上記のPython 2.4を実行すると、このエラーが発生します。

File "<stdin>", line 46 
     with p.stdout: 
    ^
SyntaxError: invalid syntax 

それはあなたがsys.exit()でのpython 2.4を使用していることを検出し、その代わりに、スクリプトを読んで運び、with p.stout:がどこにあるか、上記のエラーを与えるようスクリプトは、すぐに終了していない理由を私は理解していません読む。

私はwith p.stdout:行を削除しました。正常に動作し、print 'hello'は読み取れません。私はなぜwith p.stdout:がスクリプトを中断させているのか分かりません。これは2.6と2.7で完璧に動作します。

なぜPython 2.4がまだwith p.stdout:行を読むのかについてのアイデアはありますか?ありがとう。

答えて

4

Python 2.4にはまだwithの構文サポートがありません。したがって、実行時ではなく解析段階でスクリプトが失敗します。あなたは、いくつかのようなラッパーを持つことによって、その回避することができます。

if version_check_ok(): 
    import actual_app 
    actual_app.run() 
else: 
    ... 

新しい構文を使用して新しいファイルがあなたはそれがそうしても安全であることを知っているまでに解析/インポートされませんこの方法です。ただし、バージョンチェックの上にインポートを移動することはできません。

+0

チェックファイルと実際のスクリプトファイルの2つのファイルを使用する必要はありませんか?私はクライアントのボックスでこのスクリプトを実行し、カールを使用するつもりですが、本当に2つのファイルをダウンロードしてスクリプトを実行する必要はありません:( – user1165419

+0

@ user1165419 'with'を使わないようにコードを書き直すことができます。結局のところ、構文の砂糖だけです。あなたのリソースを手動で開いたり閉じることができます(ちょっとだけ覚えておいてください) – viraptor

+0

私はスクリプトオプションをインポートするのが好きです。 'curl http://main_script.py | python'。インターネット経由でスクリプトをインポートすることはできますか?つまり、' curl check_version_script.py'を実行し、 'actual_app'を読み込む代わりに'import http:// main_script.py'のようにインターネット上でファイルをダウンロードする必要はありませんか?これは私の問題を解決する可能性があります – user1165419

関連する問題