8

我正在编写一个 linux 应用程序,它使用 PyQt4 作为 GUI 并且仅在远程会话期间使用
ssh -XY / vnc)。

因此,有时可能会发生用户忘记使用 X 转发参数运行ssh或 X 转发由于某种原因不可用的情况。在这种情况下,应用程序严重崩溃(不幸的是,我不得不使用包装在 python 中的旧 C++ 库,如果应用程序崩溃,它会完全弄乱用户的当前会话)。

我不能使用其他东西,所以我的想法是在加载该库之前检查 X 转发是否可用。但是我不知道该怎么做。

我通常使用 xclock 来检查我的会话是否启用了 X 转发,但使用 xclock 听起来像是一个很大的解决方法。

添加
如果可能的话,我想使用另一种方法,而不是创建一个空的 PyQt 窗口并捕获异常。

4

4 回答 4

8

检查$DISPLAY是否设置了环境变量 - 如果他们没有使用ssh -X,它将是空的(而不是包含类似的东西localhost:10)。

于 2012-08-25T15:46:40.740 回答
8

如前所述,您可以检查 DISPLAY 环境变量:

>>> os.environ['DISPLAY']
'localhost:10.0'

如果您愿意,您实际上可以连接到显示端口以查看 sshd 正在侦听它:

import os
import socket

def tcp_connect_to_display():
        # get the display from the environment
        display_env = os.environ['DISPLAY']

        # parse the display string
        display_host, display_num = display_env.split(':')
        display_num_major, display_num_minor = display_num.split('.')

        # calculate the port number
        display_port = 6000 + int(display_num_major)

        # attempt a TCP connection
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
                sock.connect((display_host, display_port))
        except socket.error:
                return False
        finally:
            sock.close()
        return True

这依赖于使用端口 6000 + 显示编号的标准 X 配置。

于 2012-08-25T17:03:18.963 回答
2

与您的 xclock 解决方案类似,我喜欢运行 xdpyinfo 并查看它是否返回错误。

于 2012-08-25T17:08:06.347 回答
0

X-Server 可以使用TkInter检查,如下例所示(但PyQt4应该有类似的方法):

import time
import sys
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

while True:
    try:
        root = tk.Tk()
        break
    except tk.TclError as e:
        if "$DISPLAY" in str(e):
            print("$DISPLAY not set. Exiting.")
            sys.exit(1)
        print("Waiting for X server to start...")
        time.sleep(1)

print("X server running")
root.destroy()
sys.exit(0)

这将检查$DISPLAY设置、X-Server 进程和相关xhost授权(但使用TkInter而不是PyQt4)。

于 2019-01-27T10:26:54.187 回答