2016-07-11 10 views
0

버전 2.6 또는 2.7에서만 실행되는 스크립트를 작성했습니다. 다른 버전이 설치되어 있는지 확인하고 사용 가능한 호환 버전이 있는지 확인하기 위해 안전성 검사를 실시했습니다. 다음은 제 코드입니다.왜 파이썬 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()와 파이썬 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

체크 파일과 실제 스크립트 파일의 두 파일을 사용하지 않아도되는 방법이 있습니까? 이 스크립트를 클라이언트 상자에서 실행하고 곱슬 곱슬 함을 사용하여 실제로 두 파일을 다운로드하지 않고 스크립트를 실행해야합니다. ( – user1165419

+0

@ user1165419'with '를 사용하지 않도록 코드를 다시 작성할 수 있습니다. 결국 문법 설탕 일 뿐이므로 수동으로 리소스를 열고 닫아야합니다 (catch해야하는 모든 예외에 대해 기억하십시오). – viraptor

+0

스크립트 옵션 가져 오기에 대해 궁금합니다. 스크립트를 실행하기 위해 컬을 사용합니다. 'curl http://main_script.py | python'. 인터넷을 통해 스크립트를 가져올 수 있습니까? 즉, 'curl check_version_script.py'를 할 수 있고,'import actual_app' 대신 뭔가를 사용할 수 있습니다. 'import http : // main_script.py'처럼 모든 파일을 다운로드 할 필요없이 인터넷을 통해 이루어집니다. 내 문제를 해결할 수 있습니다. – user1165419