Исправление ошибки sys.excepthook в скрипте bash - PullRequest
8 голосов
/ 31 октября 2011

Я написал 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!"

Я довольно новичок в сценариях оболочки и очень плохо знаком с Python.Буду благодарен за любую помощь.

Ответы [ 3 ]

19 голосов
/ 01 января 2012

Я видел эту ошибку при передаче вывода из скрипта Python 2.6.2 в команду head в bash в Ubuntu 9.04. Я добавил try блоки для закрытия stdout и stderr перед выходом из скрипта:

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

Я больше не вижу ошибку.

3 голосов
/ 11 августа 2014

Необходимо выполнить два шага:

Шаг 1:

В вашем скрипте csvcut найдите все места, где вызывается sys.stdout.write(), убедитесь, чтоsys.stdout.flush() вызывается после каждого write().

Шаг 2:

После выполнения шага 1 вы сможете захватить IOError в скрипте Python.Ниже приведен один пример того, как обращаться со сломанной трубой:

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

Надеюсь, это поможет!

1 голос
/ 31 октября 2011

Я предполагаю, что скрипт csvcut Python в противном случае работает, но выдает ошибку, когда пытается закрыть файлы и выйти.

Если, как вы говорите, скрипт работает иначе и предполагает, что ошибка 'csvcut' выбрасывает выходные данные в stderr, то перенаправление его в / dev / null будет временным исправлением.

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

Естественно любые другие сообщения об ошибках в вашем heredoc также будут перенаправлять туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...