2016-02-04 3 views
1

Моя программа в python запускается на RaspBerry Pi и создает несколько объектов (входы и выходы GPIO, http Server, webSocket, интерфейс I2C и т. Д.) С потоком).Как выйти из программы python на малине

При выходе из моей программы я пытаюсь очистить все ресурсы и удалить все экземпляры. Для сетевых объектов я закрываю гнезда для прослушивания и так далее. Я заканчиваю вызовом sys.exit(), но программа doe не выходит и не возвращается одна к консоли linux (мне нужно нажать ctrl + z).

Есть ли какие-то объекты, которые не выпущены, как узнать, и как заставить выход?

С уважением.

+0

Вы упомянули темы: не-демонические потоки не убиты 'sys.exit()' и могут сохранить ваш процесс в живых. Вы можете проверить выполнение потоков с помощью ['active_count'] (https://docs.python.org/3/library/threading.html#threading.active_count) и [' enumerate'] (https: //docs.python. org/3/library/threading.html # threading.enumerate) –

+0

Я попробую предложить threading.enumerate и оставить потоки: <_Timer (токарно-6, начало 652)> <_MainThread (MainThread, начал 4180)> < _Timer (Thread-5, начал 7384)> Я не знаю эти темы ... – maiagarbot

+0

Измените свой вопрос, добавив эту информацию (чтобы их было легче читать). Как вы можете видеть, большинство потоков являются демонами, поэтому вы можете их игнорировать. Единственными недемоническими являются два '' Тимера'. Осмотрите их (они должны иметь атрибут '.function') –

ответ

0

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

В моем случае Kivy использует объекты «Clock()» для вызова функции с определенными временными интервалами, обеспечивая основной цикл программы.

Как оказалось, хотя все работает нормально на ПК (в Linux или Windows), на Raspberry Pi вы должны вручную остановить все циклы программ, иначе «sys.exit()» не будет работать.

Сначала у меня была команда «sys.exit()» при нажатии клавиши. Это не работало для Малины. Таким образом, вместо этого я использовал глобальную переменную, которая изменила бы значение при нажатии клавиши выхода и проверила бы ее значение в программном цикле, где я тогда называл «sys.exit()» (и «return False», что сигнализирует Kivy для уничтожения объекта Clock()).

Я также использовал отдельные объекты Clock() для некоторых анимаций в своей программе, и я заметил, что если я нажму кнопку exit во время анимации, моя программа замерзнет без выхода - как и раньше, потому что «sys.exit()» был вызван, когда выполнялись объекты Clock().

Суть - если у вас есть проблемы с «sys.exit()» на Raspberry Pi, убедитесь, что все программы петли в коде остановлены перед вызовом sys.exit().

В качестве наиболее простого примера, если у вас есть программа, запущенная цикл вроде

while True: 

использовать вместо

while running: 
    # where running = True 

изменится на "бегущих = False" перед вызовом «sys.exit ()».

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