При попытке запустить мой сценарий 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, но мне было рекомендовано перенести его сюда.