2010-09-02 2 views
2

У меня есть скрипт python, который использует subprocess.Popen для запуска нескольких экземпляров другого скрипта python, каждый из которых работает в другом файле.Коды ошибок Python

У меня есть коллекция из 300 файлов, которые я просматриваю в этом процессе для целей тестирования. каждый прогон, случайное количество файлов сбой, всегда разные файлы, поэтому нет ничего плохого в самих файлах, но подпроцесс выходит с кодом ошибки -6 или -11, когда это происходит. и если я снова запустил сценарий с теми же входными файлами, он будет успешно выполнен.

Что такое -6 и -11? могут ли они быть связаны с исключениями python?

Редактировать, чтобы уточнить: сценарии на самом деле являются командами управления django. У меня есть большая попытка: except clause, которая улавливает любые исключения и вызывает sys.exit (1), поэтому сбой происходит за пределами моего кода. возможно, при загрузке других модулей. Я проверил исходный код django и кажется, что всегда вызывает sys.exit (1) в случае возникновения каких-либо ошибок, поэтому -6 и -11 появляются с более низкого уровня. Я думаю, что они могут быть стражами, связанными с условиями гонки, но я не могу быть уверен в этом.

+0

Коды статуса выхода - это возвращаемые значения из сценария. Что делает сценарий 'sys.exit()' do? –

+0

см. Редактирование i, сделанное на исходный вопрос. – user61000

ответ

6

Вы получаете статус выхода из mysubproc.returncode?

От http://docs.python.org/library/subprocess.html#subprocess.Popen.returncode:

Отрицательное значение указывает на то, что -N ребенок был прерван сигналом N (только для Unix).

Сигналы 6 & 11 являются SIGABRT (прервать) и SIGSEGV (Segfault) (http://linux.die.net/man/7/signal). Я предполагаю, что эти другие скрипты сталкиваются с нечестностью с расширением или одной из библиотек, от которых зависит расширение. Возможно, у вас есть плохая сборка - либо перекомпилируйте, если вы сделали это вручную, либо посмотрите, есть ли обновленный пакет.

+0

Это именно то, что я искал .. спасибо тонну. из любопытства, что может вызвать SIGABRT? – user61000

+0

@ user61000 - Из того, что я понимаю, обычно это управление памятью C/C++ во время выполнения - например, с двойным удалением и т. Д. Это, в свою очередь, вызывает прерывание(), которое в основном заставляет процесс сигнализировать SIGABRT сам по себе. Кажется, что это идет рука об руку с неверными ссылками на память ... похоже, что в одной из библиотек есть плохое управление указателем/памятью. –

+0

@ user61000 - это отвечает на вопрос о том, откуда взялись SIGABRT :) http://stackoverflow.com/questions/3413166/when-does-a-process-get-sigabrt-signal-6 –

Смежные вопросы