我的当前桌面环境是什么?

7

如何使用Python获取我的桌面环境?我希望结果是gnomeKDE或其他。

4个回答

16
我在一个项目中使用了这个工具:
    def get_desktop_environment(self):
        #From https://dev59.com/jUvSa4cB1Zd3GeqPczsH
        # and http://ubuntuforums.org/showthread.php?t=652320
        # and http://ubuntuforums.org/showthread.php?t=652320
        # and http://ubuntuforums.org/showthread.php?t=1139057
        if sys.platform in ["win32", "cygwin"]:
            return "windows"
        elif sys.platform == "darwin":
            return "mac"
        else: #Most likely either a POSIX system or something not much common
            desktop_session = os.environ.get("DESKTOP_SESSION")
            if desktop_session is not None: #easier to match if we doesn't have  to deal with caracter cases
                desktop_session = desktop_session.lower()
                if desktop_session in ["gnome","unity", "cinnamon", "mate", "xfce4", "lxde", "fluxbox", 
                                       "blackbox", "openbox", "icewm", "jwm", "afterstep","trinity", "kde"]:
                    return desktop_session
                ## Special cases ##
                # Canonical sets $DESKTOP_SESSION to Lubuntu rather than LXDE if using LXDE.
                # There is no guarantee that they will not do the same with the other desktop environments.
                elif "xfce" in desktop_session or desktop_session.startswith("xubuntu"):
                    return "xfce4"
                elif desktop_session.startswith('ubuntustudio'):
                    return 'kde'
                elif desktop_session.startswith('ubuntu'):
                    return 'gnome'     
                elif desktop_session.startswith("lubuntu"):
                    return "lxde" 
                elif desktop_session.startswith("kubuntu"): 
                    return "kde" 
                elif desktop_session.startswith("razor"): # e.g. razorkwin
                    return "razor-qt"
                elif desktop_session.startswith("wmaker"): # e.g. wmaker-common
                    return "windowmaker"
            if os.environ.get('KDE_FULL_SESSION') == 'true':
                return "kde"
            elif os.environ.get('GNOME_DESKTOP_SESSION_ID'):
                if not "deprecated" in os.environ.get('GNOME_DESKTOP_SESSION_ID'):
                    return "gnome2"
            #From http://ubuntuforums.org/showthread.php?t=652320
            elif self.is_running("xfce-mcs-manage"):
                return "xfce4"
            elif self.is_running("ksmserver"):
                return "kde"
        return "unknown"

    def is_running(self, process):
        #From http://www.bloggerpolis.com/2011/05/how-to-check-if-a-process-is-running-using-python/
        # and http://richarddingwall.name/2009/06/18/windows-equivalents-of-ps-and-kill-commands/
        try: #Linux/Unix
            s = subprocess.Popen(["ps", "axw"],stdout=subprocess.PIPE)
        except: #Windows
            s = subprocess.Popen(["tasklist", "/v"],stdout=subprocess.PIPE)
        for x in s.stdout:
            if re.search(process, x):
                return True
        return False

谢谢!这太完美了! - ignabe
7
你应该将它制作成一个Python模块并放到PyPI上。 - Jabba
4
我需要说明的是,在Ubuntu Studio操作系统中,os.environ.get("DESKTOP_SESSION")会返回'ubuntustudio'。为了获取正确的桌面环境,我使用os.environ['XDG_CURRENT_DESKTOP'].lower()来获得'xfce'。这是一种扩展这个令人惊叹的代码的解决方法。请上传它。 - DarkXDroid
1
这在Linux Mint 17.3中不起作用,一直返回未知。 - answerSeeker
1
Ubuntu Studio现在使用KDE的Plasma桌面。 - Serge Stroobandt

6

在Ubuntu 9.10上测试:

>>> import os
>>> os.environ.get('DESKTOP_SESSION')
'gnome'

编辑2:正如评论所说,随着新版本的GNOME出现,这种方法变得越来越不可靠。我现在也在运行Ubuntu 18.04,它返回“ubuntu”而不是以前的“gnome”。
编辑1:如下面的评论所述,这种方法对于某些操作系统不起作用。其他两个答案提供了解决方法。

刚刚正在写一个涉及枚举进程的答案,但这个更好。 - mdm
3
我认为是因为 Mac 只有一个! - aliva
1
在我的 openSUSE 11.1 系统中,DESKTOP_SESSION 被设置为“default”。 - R Samuel Klatchko
1
对我来说返回“ubuntu”。在Ubuntu 12.04上使用原始的Unity。任何使用此方法的人都必须进行一些测试以找到各种响应,如果您想确定是否需要GTK/QT用户界面,则不是很好。 - David C. Bishop
GNOME也可以返回“gnome-xorg”,因为Wayland现在是默认设置,而Ubuntu GNOME桌面可能会返回不同的内容。 - TheKodeToad
显示剩余2条评论

4
你可以尝试这样做:
def detect_desktop_environment():
    desktop_environment = 'generic'
    if os.environ.get('KDE_FULL_SESSION') == 'true':
        desktop_environment = 'kde'
    elif os.environ.get('GNOME_DESKTOP_SESSION_ID'):
        desktop_environment = 'gnome'
    else:
        try:
            info = getoutput('xprop -root _DT_SAVE_MODE')
            if ' = "xfce4"' in info:
                desktop_environment = 'xfce'
        except (OSError, RuntimeError):
            pass
    return desktop_environment

请在此处阅读讨论:http://ubuntuforums.org/showthread.php?t=1139057


这对于我的桌面来检测KDE是有效的(不像DESKTOP_SESSION,它返回None)。 - JAL
关于这个问题的更新。使用 xprop -root | grep -io 'xfce',然后至少在 'xfce' 和 'lxde' 之间交替。这适用于 Raspbian 和 Ubuntu Studio。将输出更改为小写以便更好地理解或在语句下进行选择。 - DarkXDroid

4

有时,人们会同时使用不同的桌面环境。使用 xdg-utils 使您的应用程序与桌面环境无关;这意味着使用 xdg-open 打开文件或 URL,使用 xdg-user-dir DOCUMENTS 查找文档文件夹,使用 xdg-email 发送电子邮件等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接