Why do I get warning "QStandardPaths: XDG_RUNTIME_DIR not set" every time for a PyQt5 project

55,392

Not sure it is a pyqt or python related problem. Probably then running with root privileges you are loosing some environment variables and XDG_RUNTIME_DIR is among them.

It's not a big deal since Qt is smart enough to fall back to reasonable default but you can preserve current uses's environment vars with sudo -E <you_app>:

-E' The -E (preserve environment) option indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may return an error if the -E option is specified and the user does not have permission to preserve the environment.


UPD: instead of copying all your vars into elevated (root) environment (which may rise security concern), you can explicitly specify a set of variables to keep via /etc/sudoers file. Edit this file with sudo visudo command and add a line:

Defaults        env_keep += "XDG_RUNTIME_DIR"

UPD2: if you want to access serial device without superuser privileges add an your user into device's group (usually it's called dialout):

# check group
>>> ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 4, 66 Aug  6 12:23 /dev/ttyUSB0
# add your user to a group
>>> sudo usermod -a -G dialout <your_username>

logout - login may be required after group change

Share:
55,392
Nithin Varghese
Author by

Nithin Varghese

I am mostly interested in embedded software development . Most of my work revolves around arm, avr , arduino, raspberry pi.

Updated on September 01, 2020

Comments

  • Nithin Varghese
    Nithin Varghese over 3 years

    I am using python 3.6.2 and using Emacs 25 for the development of a PyQt5 project in Ubuntu and it's running with root privileges. This works fine but I'm getting

    QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
    

    from the command line for each run.

    It would great, if you let me understand what this is and the possible solution for to avoid the same.

    The code

    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    
      def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)
        self.setupUi(self)
        # TODO: board connection
        self.comPort.addItems([str(port) for port in display_SerialPorts()])
        self.comPort.highlighted.connect(self.boardConnet)
    
    
      def boardConnet(self):
        baudrate = 9600
        port = self.comPort.currentText()
        ser = serial.Serial(
            port, baudrate, timeout=1)  # open first serial port
        ser.close()
        ser.open()
    

    Thanks in advance for your time – if I’ve missed out anything, over- or under-emphasised a specific point let me know in the comments.