#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 не требуется.