web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens l'avertissement "QStandardPaths: XDG_RUNTIME_DIR non défini" à chaque fois pour un projet PyQt5

J'utilise python 3.6.2 et j'utilise Emacs 25 pour le développement d'un projet PyQt5 dans Ubuntu et il fonctionne avec les privilèges root. Cela fonctionne bien mais je reçois

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

à partir de la ligne de commande pour chaque exécution.

Ce serait formidable, si vous me permettez de comprendre ce que c'est et la solution possible pour éviter la même chose.

Le 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()

Merci d'avance pour votre temps - si j'ai raté quelque chose, sur ou sous-souligné un point spécifique, faites-le moi savoir dans les commentaires.

5
Nithin Varghese

Pas sûr que ce soit un problème lié à pyqt ou python. En exécutant alors avec les privilèges root, vous perdez certaines variables d'environnement et XDG_RUNTIME_DIR en fait partie.

Ce n'est pas grave car Qt est suffisamment intelligent pour revenir à une valeur par défaut raisonnable, mais vous pouvez conserver les variables d'environnement des utilisations actuelles avec Sudo -E <you_app>:

-E 'L'option -E (préserver l'environnement) indique à la politique de sécurité que l'utilisateur souhaite conserver ses variables d'environnement existantes. La stratégie de sécurité peut renvoyer une erreur si l'option -E est spécifiée et que l'utilisateur n'est pas autorisé à préserver l'environnement.


UPD: au lieu de copier tous vos vars dans un environnement élevé (racine) (ce qui peut poser des problèmes de sécurité), vous pouvez spécifier explicitement un ensemble de variables à conserver via /etc/sudoers fichier. Modifiez ce fichier avec Sudo visudo commande et ajoutez une ligne:

Defaults        env_keep += "XDG_RUNTIME_DIR"

UPD2: si vous souhaitez accéder au périphérique série sans les privilèges de superutilisateur ajoutez un votre utilisateur dans le groupe de l'appareil (généralement il s'appelle 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>

déconnexion - une connexion peut être requise après un changement de groupe

6
9dogs