解决bash脚本中的sys.excepthook错误

时间:2011-10-31 14:32:55

标签: python bash shell unix

我写了一个bash脚本,它完全按照我的意愿去做,但是却出现了以下错误:

close failed in file object destructor: sys.excepthook is missing lost sys.stderr

我完全不知道如何解决这个问题。这是脚本:

#!/bin/bash

usage () { echo "${0##*/} inputfile outputfile"; exit 1; }

(($#==2)) || usage

INPUTFILE="$1"
OUTPUTFILE="$2"

#  All that is written between between the 'cat' command and 
#+ 'EOF' will be sent to the output file.
cat <<EOF >$OUTPUTFILE
$(date "+Generated on %m/%d/%y at %H:%M:%S")

DATA AUDIT: $1

------------
COLUMN NAMES
------------

$(csvcut -n $INPUTFILE)

---------------------------------------
FIRST TEN ROWS OF FIRST FIVE COLUMNS 
---------------------------------------

$(csvcut -c 1,2,3,4,5 $INPUTFILE | head -n 10)

------------
COLUMN STATS
------------

$(csvcut $INPUTFILE | csvstat )

---END AUDIT
EOF

echo "Audited!"

我是shell脚本的新手,也是python的新手。我将不胜感激任何帮助。

3 个答案:

答案 0 :(得分:19)

在将来自Python 2.6.2脚本的输出汇总到Ubuntu 9.04上的head中的bash命令时,我看到了这个错误。在退出脚本之前,我添加了try块以关闭stdoutstderr

try:
    sys.stdout.close()
except:
    pass
try:
    sys.stderr.close()
except:
    pass

我不再看到错误了。

答案 1 :(得分:3)

您需要执行两个步骤:

第1步:

csvcut 脚本中,找到调用sys.stdout.write()的所有位置,确保在每个sys.stdout.flush()后调用write()

第2步:

完成第1步后,您现在应该能够在Python脚本中捕获IOError。以下是如何处理破裂管道的一个示例:

try:
    function_with_sys_stdout_write_call()
except IOError as e:
    # one example is broken pipe
    if e.strerror.lower() == 'broken pipe':
        exit(0)
    raise       # other real IOError

希望它有所帮助!

答案 2 :(得分:1)

我认为csvcut Python脚本功能正常,但在尝试关闭文件并退出时会抛出错误。

正如你所说,如果脚本正在工作并且假设错误'csvcut'将输出抛出到stderr然后将其重定向到/ dev / null将是一个临时修复。

cat <<EOF >$OUTPUTFILE 2>/dev/null

当然,你的heredoc中的任何其他错误消息也会重定向。