我正在编写一个脚本来读取跟踪代码,查看将跟踪发布到网站的结果并打印一些消息并具有返回值。 这是python代码的一部分:
# 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
在这里,我不仅要读取打印(对于最终用户),还要读取返回值(有条件使用)。这个脚本应该读取.py的输出并给我发一封电子邮件,以防上次检查有更新(我将把这个脚本放在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 myuser@mydomain.com -s '$CODE: Tracking status'
fi
问题是$?
总是返回0
,而我在if中的字符串检查不起作用,因为我认为它也会读取update()打印,其中包含打印中的变量。
如何在不更改python脚本的情况下运行此shell脚本?
提前致谢。
答案 0 :(得分:0)
我怀疑你可以用子进程模块做你想做的事。在将stdout定向到文件时使用rc = subprocess.call(...)
来获取返回码,或者使用p = subprocess.Popen(...)
然后使用p.communicate
来获取输出并使用p.returncode
来获取返回码。