Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测X11是否可用(python)_Python_User Interface - Fatal编程技术网

检测X11是否可用(python)

检测X11是否可用(python),python,user-interface,Python,User Interface,首先,检测X11是否正在运行并可用于python脚本的最佳/最简单方法是什么 父进程? 会议主持人? X个环境变量? 其他的 其次,我希望有一个实用工具(python脚本)来显示gui(如果可用),否则使用命令行支持的工具 我突然想到了这个 -主python脚本(检测gui是否可用并启动相应的脚本) -gui或命令行python脚本启动 -两者都使用通用模块来完成实际工作 我非常愿意接受简化这一点的建议 我会检查是否设置了显示(这毕竟是C API X11应用程序所做的) 导入操作系统 如果os.

首先,检测X11是否正在运行并可用于python脚本的最佳/最简单方法是什么

父进程?
会议主持人?
X个环境变量?
其他的

其次,我希望有一个实用工具(python脚本)来显示gui(如果可用),否则使用命令行支持的工具

我突然想到了这个

-主python脚本(检测gui是否可用并启动相应的脚本)
-gui或命令行python脚本启动
-两者都使用通用模块来完成实际工作


我非常愿意接受简化这一点的建议

我会检查是否设置了显示(这毕竟是C API X11应用程序所做的)

导入操作系统
如果os.environ.get('DISPLAY'):
打印(“X11可用”)

您只需启动gui部件,并捕获当X(或任何其他依赖于平台的图形系统)不可用时它引发的异常


在运行基于文本的部件之前,请确保您确实拥有一个交互式终端。您的进程可能在没有可见终端的情况下启动,这在KDE、gnome或windows等图形用户环境中很常见。

请检查
xset-q的返回代码:

def X_is_running():
    from subprocess import Popen, PIPE
    p = Popen(["xset", "-q"], stdout=PIPE, stderr=PIPE)
    p.communicate()
    return p.returncode == 0
至于问题的第二部分,我建议采用以下
main.py
结构:

import common_lib

def gui_main():
    ...

def cli_main():
    ...

def X_is_running():
    ...

if __name__ == '__main__':
    if X_is_running():
        gui_main()
    else:
        cli_main()

“X”是指“X窗口系统”还是“某个随机软件”中的“X”?问题的GUI部分倾向于消除“X”的歧义,但我同意指定X11可能会使问题更清楚。@Erik:对我来说,GUI是指“随机软件X的控制台应用程序”。为了避免重复问题,这有助于将每个问题合理地弄清楚。事实上,这也是我最喜欢的方法。这也很常见:上次我检查时,Redhat的Anaconda安装程序也会这样做。这是最简单的。我认为显示答案很好,但python异常已经发生了;这取决于您想要的位置如果没有设置显示(以我的经验),ie import gtk会导致异常。我想如果您携带足够的设备,您可以检查显示,然后为gui库进行导入。我觉得,显示的另一个优点是基于最纯粹的编程实践,异常不应该处理程序逻辑(如果您想将其分类为检查显示为程序逻辑)会引发什么异常?谢谢。检查xset返回代码的方法对我来说比只检查显示变量更有用:在我的情况下,设置了显示变量,但由于一些不相关的网络/防火墙问题,X11连接无法工作。