Как захватить Ctrl+C в скрипте Python, который выполняет скрипт Ruby?

Я выполняю сценарий Ruby из сценария Python. Вот как выглядит мой скрипт Python «script007.py»:

.
.
.
os.system("ruby script.rb") #executing ctrl+c here 

print "should not be here"
.
.
.

Я выполняю CTRL+C, когда скрипт Ruby работает, но он просто останавливает "script.rb" и продолжает остальную часть "script007.py". Я знаю это, потому что он печатает «не должно быть здесь», когда сценарий Ruby остановлен.

Есть ли способ поймать CTRL+C в моем сценарии Python, даже если это происходит в сценарии Ruby? Дайте мне знать, если требуются дополнительные пояснения.


person Redson    schedule 16.02.2015    source источник


Ответы (2)


В вашем Ruby-скрипте:

trap('SIGINT') { exit 1 }

В вашем скрипте Python os.system() должно возвращать значение, переданное exit. Вы можете использовать это перенаправление потока управления, если это необходимо, например. позвоните sys.exit().

person Mori    schedule 16.02.2015

В Python SIGINT вызывает специальное исключение, которое вы можете перехватить. Однако если дочерний процесс принимает сигнал SIGINT и отвечает на него, он не достигает родительского процесса. Затем вам нужно найти другой способ сообщить от ребенка к родителю о том, почему ребенок вышел. Обычно это код выхода.

В любом случае вам следует начать заменять os.system() инструментами из модуля subprocess (это задокументировано, просто зайдите и прочитайте об этом в документы subprocess). Вы можете сгенерировать определенный код выхода в дочернем элементе, когда он выходит после получения SIGINT, и проанализировать код выхода в родительском. Затем вы можете условно выйти из родительского процесса сразу после завершения дочернего процесса, в зависимости от того, какой был код выхода дочернего процесса.

Пример: ваш ребенок (программа Ruby) завершает работу с кодом 15 после получения SIGINT. В родительской (программе Python) вы должны сделать что-то вроде:

p = subprocess.Popen(...)
out, err = p.communicate(...)
if p.returncode == 15:
    sys.exit(1)
print "should not be here"
person Dr. Jan-Philip Gehrcke    schedule 16.02.2015