Python, запущенный в rc.local, не всегда записывает в файл - PullRequest
0 голосов
/ 27 марта 2019

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

. Я создал версию (см. Ниже), которая должна написать «Нет подключенного геймпада. Пожалуйста, включите его!»каждый раз, когда он ищет геймпад, и как только он находит, он должен писать «Y» или «B» в один и тот же файл каждый раз, когда нажимается эта кнопка.

Он всегда пишет «Нет подключенного геймпада. Пожалуйста, включите егона!"в файл, но затем не записывает нажатые кнопки после этого.Опять же, когда я запускаю его не из rc.local, он работает нормально.

Поиск решений в Интернете. Я обнаружил, что python не может правильно записывать файлы при работе в фоновом режиме.Я попытался запустить его как «python -u» в rc.local, добавив «#! / Usr / bin / python -u» в начало файла и сбросив его, используя f.flush () и sys.stdout.flush () в разных комбинациях.

Это мой файл rc.local

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
#sudo python /home/pi/sample.py &
python -u /home/pi/Desktop/RPi_Bluetooth_RoboClaw/On_Boot_Motor.py &
exit 0

И это соответствующие части кода, который я запускаю.Сначала он проверяет, подключен ли геймпад, а затем должен начать запись выходных данных в файл.

#!/usr/bin/python -u

import time
from roboclaw import Roboclaw
from evdev import InputDevice, categorize, ecodes
import fnmatch
import os

f = open("/home/pi/Desktop/Output.txt","w")

gamepadConnect = False
while(not gamepadConnect):
    try:
        gamepad = InputDevice('/dev/input/event0')
        gamepadConnect = True
    except:
        f.write("No Gamepad Connected. Please turn it on! \n")
        time.sleep(0.5)

f.close()

#button code variables as found for 8bitdo gamepad
bBtn = 305
yBtn = 308

while(True):
    f = open("/home/pi/Desktop/Output.txt","a")
    try:
        for event in gamepad.read_loop():
            if event.type == ecodes.EV_KEY:
                if event.value == 1:
                                        #if the Y button is pressed
                    if event.code == yBtn:
                        #Turn Left
                        f.write("Y")
                                        #if the B button is pressed
                    elif event.code == bBtn:
                        #Inch
                        f.write("B")
    except KeyboardInterrupt:          
        break

    f.flush()
        sys.stdout.flush()
    f.close()

По сути, я пытаюсь выяснить, почему он пишет «Нет подключенного геймпада. Пожалуйста, включите его.на!"а не нажатые кнопки, и в идеале я хотел бы получить решение, которое я мог бы использовать при отправке байтов драйверам двигателя, например что-нибудь о том, как rc.local запускает файл.

...