Почему Python не выходит из повышенного исключения при выполнении с абсолютным путем?

SOLVED: перезагрузка машины, похоже, устранила проблему. Я обновлю, если проблема вернется.

У меня возникла проблема, когда Python2.6 зависает после возникновения исключения, особенно когда foo.py вызывается с абсолютным путем (/home/user/bar/foo.py). Затем мне нужно ctrl+c выйти из программы. Если вы вызываете из каталога bar как ./foo.py или из корневого каталога как ./home/user/bar/foo.py, программа завершается правильно.

foo.py:

#!/usr/bin/env python2.6
print 'begin'
x = [0, 1, undefined]
print 'x'

или

#!/usr/bin/env python2.6
print 'begin'
raise Exception('stopping here')

Я также могу упомянуть, что a sys.exit() отлично работает без проблем.

#!/usr/bin/env python2.6
import sys
print 'begin'
sys.exit(0)

Что происходит с исключением, которое не завершает работу программы? Это, скорее всего, относится к моей конфигурации. Где я должен искать решение?

EDIT: execfile('/home/user/bar/foo.py') отлично работает при запуске интерактивного режима. Кроме того, запуск nohup /home/user/bar/foo.py & приводит к зависанию процесса, который должен быть убит.

Запуск версии CentOS 6.3 (Final). Этот вопрос не всегда существовал. Это только началось около месяца назад в выходные (я не использовал машину в это время).

ОБНОВЛЕНИЕ: отладка с GDB, обратная линия указывает на libpthread.so.0.

#0  0x000000364340e890 in __connect_nocancel () from /lib64/libpthread.so.0
#1  0x00007ffff18960d8 in ?? () from /usr/lib64/python2.6/lib-dynload/_socketmodule.so
#2  0x00007ffff189815c in ?? () from /usr/lib64/python2.6/lib-dynload/_socketmodule.so
#3  0x00007ffff7d0a706 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#4  0x00007ffff7d0c797 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#5  0x00007ffff7d0abe4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#6  0x00007ffff7d0bccf in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#7  0x00007ffff7d0bccf in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#8  0x00007ffff7d0c797 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0
#9  0x00007ffff7c9adb0 in ?? () from /usr/lib64/libpython2.6.so.1.0
#10 0x00007ffff7c70303 in PyObject_Call () from /usr/lib64/libpython2.6.so.1.0
#11 0x00007ffff7d04dd3 in PyEval_CallObjectWithKeywords () from /usr/lib64/libpython2.6.so.1.0
#12 0x00007ffff7d28cd2 in PyErr_PrintEx () from /usr/lib64/libpython2.6.so.1.0
#13 0x00007ffff7d29297 in PyRun_SimpleFileExFlags () from /usr/lib64/libpython2.6.so.1.0
#14 0x00007ffff7d35c32 in Py_Main () from /usr/lib64/libpython2.6.so.1.0
#15 0x000000364281ecdd in __libc_start_main () from /lib64/libc.so.6
#16 0x0000000000400649 in _start ()

Кто-нибудь знает, что это значит?

Ответ 1

  • Перезагрузите компьютер.

Поклонившись грамоте всемогущего администратора, я смог перезагрузить машину. Все хорошо. Я обновлю вопрос, если проблема вернется.

Ответ 2

Этот точный вопрос уже давно кусает меня на машине RHEL 6. В некоторых случаях Исключения приводят к зависанию. Фактически, я смог взять ваш код дословно и воспроизвести симптом.

Благодаря ответу abrtd, я определил, что был установлен пакет abrt-addon-python, который помещает abrt_exception_handler.py в местоположение сайта-пакета и вызывается во время запуска python. Этот файл переопределяет функцию sys.excepthook, которая связывается с демонами abrt с использованием сокетов. Для получения дополнительной информации см. ABRT Project Doc.

Я проверил, что добавление -S к вызову python предотвращает зависание. Однако это не очень хорошее решение, потому что опция -S предотвращает импорт всех пакетов сайта при запуске.

Лучшее решение состоит в том, чтобы добавить в свой код на Python следующее:

import sys
sys.excepthook = sys.__excepthook__

который восстанавливает исходный крючок исключения и предотвращает зависание.

Ответ 3

  • проверьте sys.path для не абсолютных каталогов.
  • вы всегда можете прорваться в него с помощью отладчика, например. GDB
  • иногда у меня есть материал в PYTHONSTARTUP, что заставляет интерактивный интерпретатор делать что-то другое...
  • strace может также быть вашим другом.

Ответ 4

Я проследил эту проблему. Он пытается записать в сокет, который был открыт abrtd.

Перезапуск abrtd "исправил" проблему. Вот почему перезагрузилась машина. Однако я не нашел основной причины проблемы.