如何在 Python 中获取用户的桌面路径(独立于语言安装,适用于 Linux)

5
我发现了一些关于如何找到用户桌面路径的问题和答案,但在我看来它们都已经过时了(至少我找到的是这样)。原因是,如果用户安装的Linux不是英语版,他或她可能将桌面放在除 ~/Desktop 以外的其他位置。例如,对于瑞典语,我相信它在 ~/Skrivbord 中。而且谁知道用户决定把他或她的桌面放在哪里呢?
因此,以下内容不适用(或任何变体):
os.sep.join((os.path.expanduser("~"), "Desktop"))

问题是:

在Linux上,我如何使用Python获取用户桌面的真实路径而不预设英语默认目录结构?


2
阅读此页面:http://freedesktop.org/wiki/Software/xdg-user-dirs - Some programmer dude
从来没有见过有人使用本地化的桌面目录名称...但是,它应该在user-dirs.dirs中定义。 - keltar
@keltar 我认为在Ubuntu的瑞典版本上默认是这样的,例如(但我不确定)。 - deinonychusaur
@JoachimPileborg 感谢您提供的链接,我会去查看一下... - deinonychusaur
如果没有人想要答案,我会根据上面的链接发布代码。 - deinonychusaur
显示剩余3条评论
2个回答

6

您可以使用xdg-user-dir实用程序,而不是直接从~/.config/user-dirs.dirs文件中读取:

import subprocess
subprocess.check_output(['xdg-user-dir', 'DESKTOP'])

这将适用于任何遵循freedesktop规范的Linux发行版,包括:KDE、Gnome、XFCE等(就像OP已经发布的解决方案一样)。
编辑: 更新了subprocess.check_output,因为参数需要在列表中。 另外值得注意的是,您可以将DESKTOP更改为例如DOCUMENTS以获取该文件夹。

1

使用@JoachimPileborg上面提供的链接:freedesktop.org/wiki/Software/xdg-user-dirs,我编写了下面这段代码,如果可以确定用户的桌面路径,它应该可以安全地给出:

import os, re
def get_desktop_path():

    D_paths = list()

    try:

        fs = open(os.sep.join((os.path.expanduser("~"), ".config", "user-dirs.dirs")),'r')
        data = fs.read()
        fs.close()
    except:
        data = ""

    D_paths = re.findall(r'XDG_DESKTOP_DIR=\"([^\"]*)', data)

    if len(D_paths) == 1:
        D_path = D_paths[0]
        D_path = re.sub(r'\$HOME', os.path.expanduser("~"), D_path)

    else:
        D_path = os.sep.join((os.path.expanduser("~"), 'Desktop'))

    if os.path.isdir(D_path):
        return D_path
    else:
        return None

它只是尝试解析应指定用户目录的文件,如果失败,则尝试使用英语默认值。最后,它验证目录是否存在。我承认正则表达式可能需要改进,但我认为这应该没问题。


1
为什么不使用简单的subprocess.check_output('xdg-user-dir')呢? 这可以在英语和非英语的 Linux 发行版上工作。对于 Windows,您可以退回到连接路径和“Desktop”。 - Bakuriu
1
@Bakuriu,差不多对了(我没想到),但如果我理解xdg的话,我要找的是xdg-user-dir DESKTOP - deinonychusaur
是的,你说得对。我忘记了你必须指定“Dekstop”作为参数。 - Bakuriu

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