运行 python 文件通过 ubuntu 服务使用 pyQT4 时无法连接到 Xserver
can not connect to Xserver while running python file using pyQT4 via ubuntu service
我正在尝试执行使用 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()
通常,服务与能够 login/start 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
变量的 and/or 的 XTerm 中进行检查。
[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
我正在尝试执行使用 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()
通常,服务与能够 login/start 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
变量的 and/or 的 XTerm 中进行检查。
[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