2014-10-01 1 views
-2

추적 코드를 읽고, 웹 사이트에 추적을 게시 한 결과를보고 일부 메시지를 인쇄하고 반환 값을 갖는 스크립트를 만들고 있습니다. 다음은 파이썬 코드의 일부 :쉘 스크립트에서 외부 프로그램의 출력과 반환 값을 읽는 방법은 무엇입니까?

# update return True if there was a change to the .msg file 
def update(cod): 
    msg = extract_msg(cod) 
    if msg == 'ERROR': 
     print('ERROR: invalid code\n') 
     sys.exit(2) 
    file = open('.msg', "r+") 
    old_msg = file.read() 
    if msg == old_msg: 
     return False 
    else: 
     print('Previous message: ' + old_msg) 
     print('Latest message: ' + msg) 
     file = overwrite(file, msg) 
     file.close() 
     return True 

def main(argv): 
    if len(argv) > 1: 
     cod_rastr = argv[1] 
    else: 
    print("Error: no arg, no code\n") 
    return -1 
    # Verify if file exists 
    if os.path.isfile(".msg") == False: 
     arq = open('.msg', 'w') 
     arq.close() 
    # post() returns the source code of the resulting page of the posted code. 
    cod = post(cod_rastr) 
    if update(cod) == False: 
     return 0 
    else: 
     print ('\n Message!\n') 
     return 1 

을 그리고 여기, 나뿐만 아니라 (최종 사용자)를 인쇄하지만 (조건부 사용) 반환 값을 읽고 싶어. 이 스크립트는 (내가은 crontab에서이 스크립트를 놓을 게요)이 평의 출력을 읽고 나에게 마지막 검사에서 업데이트가있는 경우에 이메일을 보내해야합니다

#!/bin/bash 
if [ -z "$1" ]; then 
    echo usage: $0 CODE 
    exit 
fi 

CODE=$1 
STATUS=$(myscript.py $CODE 2>&1) 
VAL=$? 
FILE=$(<.msg) 
# always prints 0 (zero) 
echo $VAL 
# I want to check for an existing update case 
if [[ $STATUS == 'Message!' ]] 
then 
    echo $STATUS 
    echo $FILE | mail [email protected] -s '$CODE: Tracking status' 
fi 

문제는 항상 $?입니다 0을 반환하고 내 문자열 검사는 if가 작동하지 않는다고 생각합니다. 왜냐하면 print()에서도 print() 변수를 가진 print를 읽었을 것이라고 생각하기 때문입니다. 파이썬 스크립트를 변경하지 않고 어떻게이 쉘 스크립트를 실행할 수 있습니까?

미리 감사드립니다.

+0

... 전체 파이썬 스크립트입니까? 당신은'main'을 달리는 것처럼 보이지 않습니다. 스크립트가 독립적으로 작동합니까? 'sys.exit()'... – bryn

+0

을 살펴보십시오. 앞에서 언급했듯이 관련 코드가 포함되어 있지 않습니다. 나는 주를 실행하고 스크립트는'requests' 모듈을 필요로합니다. 'sys.exit()'를 살펴보면 무엇을 의미합니까? – user3404142

답변

0

나는 하위 프로세스 모듈로 원하는 것을 할 수 있다고 생각합니다. rc = subprocess.call(...)을 사용하여 stdout을 파일로 보내는 동안 리턴 코드를 얻거나 p = subprocess.Popen(...)을 입력 한 다음 p.communicate을 사용하여 출력을 얻고 p.returncode을 사용하여 리턴 코드를 가져 오십시오.

관련 문제