为什么每次PyQt5项目都会收到警告“ QStandardPaths:XDG_RUNTIME_DIR未设置”

Nit*_*ese 5 python ubuntu pyqt python-3.x pyqt5

我正在使用python 3.6.2并使用E​​macs 25在Ubuntu中开发PyQt5项目,它以root特权运行。这工作正常,但我正在

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
Run Code Online (Sandbox Code Playgroud)

从命令行运行。

如果您让我了解这是什么以及避免这种情况的可能解决方案,那将是很好的。

代码

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()
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的宝贵时间。如果我错过了任何内容,请在评论中让我知道特定的地方。

9do*_*ogs 6

不确定是pyqt还是python相关问题。然后可能以root特权运行,您正在丢失一些环境变量,XDG_RUNTIME_DIR并且其中之一。

没什么大不了的,因为Qt足够聪明,可以恢复到合理的默认值,但是您可以使用以下命令保留当前使用的环境变量sudo -E <you_app>

-E'-E(保留环境)选项向安全策略指示用户希望保留其现有环境变量。如果指定了-E选项,并且用户没有保留环境的权限,则安全策略可能返回错误。


UPD:您可以显式指定一组变量以通过/etc/sudoers文件保留,而不是将所有变量复制到提升的(根)环境(这可能会引起安全问题)。使用sudo visudo命令编辑此文件并添加一行:

Defaults        env_keep += "XDG_RUNTIME_DIR"
Run Code Online (Sandbox Code Playgroud)

UPD2:如果您想在没有超级用户特权的情况下访问串行设备请将您的用户添加到设备组中(通常称为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>
Run Code Online (Sandbox Code Playgroud)

注销-更改组后可能需要登录

  • 似乎您从普通用户启动了您的应用程序,该应用程序创建了“/run/user/1000”(它是“XDG_RUNTIME_DIR”),然后您尝试从超级用户运行该应用程序并收到有关所有权错误的错误。您可以注销-登录,该目录应该被清除并自动以正确的所有权重新创建。 (2认同)