Ошибки разрешения появляются после перезагрузки - PullRequest
0 голосов
/ 06 февраля 2020

При попытке запустить мой сценарий Python3 иногда создается исключение разрешения, казалось бы, без причины, например, сценарий работает нормально, но после перезагрузки RPi возникает эта ошибка:

root@navio:/home/pi/Raspberry# python3 rpi_testing.py

PermissionError: [Errno 1] Operation not permitted 
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "Raspberry/rpi_testing.py", line 58, in receiver
rearL_pwm.initialize()
File "/home/pi/Raspberry/navio/pwm.py", line 34, in initialize
pwm_export.write(str(self.channel))
PermissionError: [Errno 1] Operation not permitted

Ошибка исчезает тоже случайно. Например, после того, как я внесу небольшое изменение в код (буквально добавив немного печати), или если я сначала запущу другой скрипт. Файл должен иметь все необходимые разрешения:

pi@navio:~/Raspberry $ ls -l rpi_testing.py
-rwxr-xr-x 1 pi pi 7702 Feb  5 14:41 rpi_testing.py

И я запускаю скрипт как root. Я не достаточно опытен, чтобы знать, на что мне еще обращать внимание, но тот факт, что скрипт запускается большую часть времени, заставляет меня верить, что сам код должен быть в порядке, но вот проблемная часть кода c:

 #!/usr/bin/python
import serial
import time
import struct
import sys
sys.path.append('/home/pi/Raspberry/navio')

import navio.pwm
import navio.util
import navio.leds
import navio.ublox

from multiprocessing import Process, Value, Array, Manager
from multiprocessing.managers import BaseManager, SyncManager
import signal

def receiver(s):
try:
    navio.util.check_apm()
    LED = navio.leds.Led()
    LED.setColor('Cyan')
    # PWM INIT
    frontR_pwm = navio.pwm.PWM(0)
    frontR_pwm.initialize()
    frontR_pwm.set_period(90)
    frontR_pwm.enable()
    frontR_pwm.set_duty_cycle(1.42)
    time.sleep(0.2)
    frontL_pwm = navio.pwm.PWM(1)
    frontL_pwm.initialize()
    frontL_pwm.set_period(90)
    frontL_pwm.enable()
    frontL_pwm.set_duty_cycle(1.42)
    time.sleep(0.2)
    rearR_pwm = navio.pwm.PWM(2)
    rearR_pwm.initialize()
    rearR_pwm.set_period(90)
    rearR_pwm.set_duty_cycle(1.42)
    rearR_pwm.enable()
    time.sleep(0.2)
    rearL_pwm = navio.pwm.PWM(3)
    rearL_pwm.initialize()
    rearL_pwm.set_period(90)
    rearL_pwm.set_duty_cycle(1.42)
    rearL_pwm.enable()
    time.sleep(0.2)
    # END PWM INIT
    while 1:
       ...do something

def mgr_sig_handler(signal, frame):
   return None
# initilizer for SyncManager
def mgr_init():
   signal.signal(signal.SIGINT, mgr_sig_handler)
   print('Initialized mananger.')

if __name__ == "__main__":
    serialPort = serial.Serial("/dev/ttyUSB0", baudrate=250000)
    processes = []
    manager = SyncManager()
    manager.start(mgr_init)

    #receiver process
    rec_p = Process(target=receiver,args=(serialPort, ))
    rec_p.start()
    processes.append(rec_p)

    try:
        for process in processes:
            process.join()
    except KeyboardInterrupt:
        print("Closing serial and ending all processes!")
        serialPort.close()

Спасибо за любые предложения о том, как подойти к этому. PS этот вопрос обычно задавался при обмене стеками RPi, но мне было рекомендовано перенести его сюда.

...