2011-10-31 71 views
8

我写的是做正是我想要它做一个bash脚本,但蹬出以下错误:寻址sys.excepthook错误

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。我会很感激任何帮助。

+1

错误来自python脚本(csvcut?),而不是来自您的bash脚本。看看它的代码相关的代码会更有用:D –

+0

这可能是因为csvcut不喜欢头部,因为它迫使进程的标准输出过早关闭? –

+0

@Antti,我猜测是这样,但是想知道在脚本中我能做些什么来解决这个问题,因为在命令行单独运行命令不会产生错误。你有没有想过如何改变头来解决可能的stdout问题?或者csvcut代码仍然是必要的?谢谢! –

回答

18

在Ubuntu 9.04上,当将输出从Python 2.6.2脚本输入head命令bash时,我发现这个错误。我加try块退出脚本之前关闭stdoutstderr

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

我不再看到的错误。

+0

任何解释为什么这项工作?我一直在一个cython脚本中发现这个错误,它使用dup/dup2做了一些重定向,这似乎解决了一些问题。 – Snorfalorpagus

+1

相关的Python bug:http://bugs.python.org/issue11380 –

+1

该解决方案还可以调用'.flush'而不是'.close'。我不知道这是否意味着什么。 ('close'意味着'flush')。 Ubuntu 14.04上的Python 2.7.8 –

1

我假定csvcut Python脚本在其他方面功能正常,但在尝试关闭文件并退出时发生错误。

如您所说,如果脚本不能正常工作,并且假设错误'csvcut'将输出信息输出到stderr,那么将其重定向到/ dev/null将是一个临时修复。

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

自然,heredoc中的任何其他错误消息也会在那里重定向。

+0

即使作为一个临时修复,这不适合我。仍然得到相同的错误。 –

3

有需要执行两个步骤:

第1步:

在你csvcut脚本,发现其中sys.stdout.write()被称为所有地点,确保sys.stdout.flush()每天write()后调用。

第2步:

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

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 

希望它有帮助!

+0

这是我的情况下的一个适当的修复。看起来像一个回溯仍然被写入标准错误,而脚本正在退出,并在退出之前丢掉了stderr。 – hayavuk