在尝试运行我的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身份运行脚本。我没有足够的经验去知道我还应该研究什么,但是脚本大部分时间都在运行,这一事实使我相信代码本身应该没问题,但这是代码中有问题的部分:
#!/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()
感谢您提供有关如何解决此问题的建议。 附言以前在RPi堆栈交换中曾问过这个问题,但建议我将其迁移到这里。