I'm using some XBee to build a mesh network and everything is working, BUT only if I run the code using sudo. Now that the code is "Finished" i want to remove this need, because i know that it isn't good.

Basic serial reading code:

import time
import serial
import RPi.GPIO as GPIO
import os

os.system("sudo systemctl stop [email protected]")
os.system("sudo systemctl stop [email protected]")

ser = serial.Serial(
    baudrate = 115200,
while 1:

Command sent to terminal:
working: sudo python3 Desktop/Old/mustwork.py
doesn't work: python3 Desktop/Old/mustwork.py error:

Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.5/site-packages/serial/serialposix.py", line 265, in open
    self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
PermissionError: [Errno 13] Permission denied: '/dev/serial0'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "Desktop/Old/mustwork.py", line 14, in <module>
  File "/home/pi/.local/lib/python3.5/site-packages/serial/serialutil.py", line 240, in __init__
  File "/home/pi/.local/lib/python3.5/site-packages/serial/serialposix.py", line 268, in open
    raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 13] could not open port /dev/serial0: [Errno 13] Permission denied: '/dev/serial0'

Some raspberry configs:

$ uname -a
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux

$ cat /boot/config.txt

$ grep -v ^\# /boot/config.txt

$ ls -lh /dev/serial*
lrwxrwxrwx 1 root root 5 mai 18 20:59 /dev/serial0 -> ttyS0
lrwxrwxrwx 1 root root 7 mai 18 20:59 /dev/serial1 -> ttyAMA0

$ groups ${USER}
pi : pi adm tty dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio

Already went to raspi-config -5 -P6 -Enable

  • What are the rights on /dev/ttyS0?
    – Janka
    Commented May 19, 2019 at 0:54

2 Answers 2


Why are you calling

os.system("sudo systemctl stop [email protected]")
os.system("sudo systemctl stop [email protected]")

These are the same interface, and if you aren't using serial console it is better to disable (using raspi-config) then there is no need for sudo.

There is no need to use sudo with /dev/serial0 provided the user is a member of group dialout (which is default for pi)

Incidentally why do you have serial in /home/pi/.local/lib/python3.5/site-packages this is included in the normal python library?

  • I'm using this os.system("sudo systemctl stop [email protected]") because sometimes i get an error message of a kind of conflict, like if the system was trying to access it too. I know, it souldn't need sudo permission... =/
    – SWoto
    Commented May 19, 2019 at 12:47

Found the answer following this tutorial.

It worked after removing the line: 'console=serial0,115200', in the cmdline.txt like bellow:

$ sudo nano /boot/cmdline.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes root wait
  • 3
    Rather than fiddling with the cmdline it is better to disable serial console in raspi-config, as suggested
    – Milliways
    Commented May 19, 2019 at 22:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.