Событие Raspberry GPIO

#python #subprocess #gpio

#python #подпроцесс #gpio

Вопрос:

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

Когда я запускаю приведенный ниже скрипт в Thonny IDE, он работает хорошо, каждый раз, когда я нажимаю кнопку, воспроизводится песня, однако, когда я пытаюсь запустить ее из terminal ( python /home/pi/Documents/Python/Douce_nuit/Douce_nuit.py ), программа немедленно останавливается, и поэтому песня не может быть воспроизведена.

Это такая же проблема, как я хотел бы запустить этот скрипт при запуске raspberry (я включил в rc.local sudo python /home/pi/Documents/Python/Douce_nuit/Douce_nuit.py )

Не могли бы вы помочь мне понять, почему он работает при запуске из IDE, но не с терминала?

Мой код:

 import RPi.GPIO as GPIO
import subprocess, sys

def playsong(channel):
    opener = "open" if sys.platform == "darwin" else "xdg-open"
    subprocess.call([opener, '/home/pi/Documents/Python/Douce_nuit/douce_nuit.mp3')

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.add_event_detect(10, GPIO.RISING, callback=playsong))
 

Комментарии:

1. Если вы запускаете это в REPL в IDE, программа будет работать до тех пор, пока открыт сеанс REPL. Однако, как отдельный скрипт, как только будет достигнут конец файла, программа завершит работу. Вам нужно будет что-то сделать, чтобы предотвратить завершение работы скрипта. Вызов input в конце скрипта предотвратит его завершение до тех пор, пока пользователь не нажмет enter , но это немного хакерский способ. В конце у вас может быть второй цикл, который завершится только тогда, когда пользователь нажмет другую кнопку (он будет зацикливаться до тех пор, пока логический флаг не будет установлен в false, например).

2. Спасибо, я добавил ввод, и теперь он работает при запуске с терминала. Однако скрипт по-прежнему не запускается автоматически, хотя я прошу об этом в файле rc.local. Любой int?

3. У меня никогда не было автозапуска на моем Pi4B, поэтому, к сожалению, я не могу с этим помочь. Однако при быстром поиске использование GPIO требует повышенных привилегий, что может быть не тем, с чем запускаются программы автозапуска (вероятно, потому, что запуск всего под root будет представлять угрозу безопасности).

4. @Baptiste, запущенный из rc.local , должен иметь правильные привилегии. Вы должны где-нибудь записать выходные данные и ошибки из своего кода, чтобы увидеть, не происходит ли сбой с полезным сообщением об ошибке. Если вы получаете ошибки и не уверены, что они означают, вы можете открыть новый вопрос.

5. Настройте свой DT на использование gpio-keys драйвера и создайте простой сценарий оболочки обработчика для события этой кнопки. На самом деле код Python не требуется.