在ubuntu服务中使用pyQT4运行python文件时无法连接到服务器

Posted

技术标签:

【中文标题】在ubuntu服务中使用pyQT4运行python文件时无法连接到服务器【英文标题】:can not connect to Xserver while running python file using pyQT4 via ubuntu service 【发布时间】:2021-01-05 06:44:57 【问题描述】:

我正在尝试执行使用 PyQT4 的 python 文件

我在服务文件下面运行

[Unit]
Description = Test
After=multi-user.target

[Service]
Type=simple
ExecStart = /usr/bin/python3 /home/nvidia/main
Restart=on-abort

[Install]
WantedBy =multi-user.target

此文件位于/lib/systemd/system/test.service 下,我将通过systemctl start Test 启动此服务

但启动此服务会导致错误标记为cannot connect to X Server, failed with result exit-code

我正在使用脚本

#!/usr/bin/python

#################################################################################################################################################

# Author          = Rucha
# Version         = V 2.0.3
# Class           = PR01 OOP
# Module          = pyqt4
# Date            = Jan 02 2021

#################################################################################################################################################
import sys
from PyQt4 import QtGui

######################################################################################################################################

class MainWindow:

    def __init__(self):
        self.vbox = QtGui.QHBoxLayout()

    def Title(self,Window,Name):
        Window.setWindowTitle(Name)

    
    def window(self):

        app = QtGui.QApplication(sys.argv)
        w = QtGui.QWidget()

        w.setGeometry(800,800,500,500)

        self.Title(w,"Test")          
        
        w.show()
        sys.exit(app.exec_())
    
MainWindow1 = MainWindow()
MainWindow1.window()

【问题讨论】:

python脚本是做什么的?它真的需要图形服务器(X11)来运行吗?你能给我们提供它的代码,或者至少是一个minimal, reproducible example吗? 是的,我已将脚本添加到我的问题@musicamante 【参考方案1】:

通常服务与能够登录/启动 X 环境的普通用户没有相同的环境。 因此我猜DISPLAY 没有设置。 在您的服务文件中尝试此操作,但确保它会在 X 已经运行后启动...

ExecStart = env -i DISPLAY=:0.0 /usr/bin/python3 /home/nvidia/main

示例 - 用户 root 尝试在 X 上运行某些东西 - 使用和不使用 DISPLAY

#kcalc
qt.qpa.screen: QXcbConnection: Could not connect to display 
Could not connect to any X display.
#env -i DISPLAY=:0.0 kcalc
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

您可以在带有和/或不带有 DISPLAY 变量的 XTerm 中检查这一点。

【讨论】:

ExecStart = env -i DISPLAY=:0.0 /usr/bin/python3 /home/nvidia/main 修改此行会导致 Exec 格式错误,Xserver 已经为 root 运行 Mh,所以在 X 服务未运行的情况下尝试一下 - 是否有任何情况下脚本(不是服务)运行时没有错误? - 我用init 2(不带X 的单用户)和init 5(带X 的多用户)更改运行或不运行 是的,主 qt 窗口指令之前的所有情况都在运行。我检查了有和没有 X 的单用户以及有和没有 X 的多用户 我也试过禁用 xhost 的访问控制【参考方案2】:
[Unit]
Description = Test
After=multi-user.target

[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/nvidia/.Xauthority"
ExecStart = /usr/bin/python /home/nvidia/main
Restart=on-failure

[Install]
WantedBy =graphical.target

我使用上述指令值使用systemd 服务成功执行了 GUI

【讨论】:

以上是关于在ubuntu服务中使用pyQT4运行python文件时无法连接到服务器的主要内容,如果未能解决你的问题,请参考以下文章

从命令提示符更新 Python 版本并将 PyQt4 转换为 PyQt5

使用 pyqt4 创建运行 python 脚本的 GUI

使用 PyCharm 导入 PyQt4.QtGui 但不导入 QtCore

如何在 PyQt4 中使用 QtGui 来收集 Python 程序的输入变量?

PyQt4 应用程序中的 Python 编辑器

如何使用 python 在 Maya 中设置目录?目前使用 PyQt4,但愿意接受任何建议