获取主目录的跨平台方法是什么?

1193

我需要获取当前登录用户的主目录位置。目前,在Linux上我一直在使用以下方法:

os.getenv("HOME")

然而,这在Windows上不起作用。正确的跨平台方式是什么?


7
这被标记为如何使用Python找到真实的用户主目录的重复问题,但我投票要重新打开,因为这个答案适用于Python 3,而旧答案则不适用。 - Dour High Arch
5个回答

2063
你想要使用os.path.expanduser
这样可以确保它在所有平台上都能正常工作。
from os.path import expanduser
home = expanduser("~")

如果你使用的是Python 3.5或更高版本,你可以使用pathlib.Path.home()来实现:
from pathlib import Path
home = str(Path.home())

但通常最好不要将Path.home()转换为字符串。使用这种方式更自然:
with open(Path.home() / ".ssh" / "known_hosts") as f:
    lines = f.readlines()

64
请注意,如果用户在Windows上登录到域并将其个人资料主文件夹设置在活动目录中,则此报告将显示映射的网络文件夹而不是本地主目录。 - scape
19
我很惊讶为什么在这个问题中没有其他人提到,但是如果你需要知道另一个用户的主目录在哪里,你可以使用os.path.expanduser('〜用户名')。不过可能只适用于Linux系统。 - Max
3
不,那是Python 2中pathlib的后移版本。对于Python 3而言,pathlib是正确的。 - Haystack
3
结果是一样的。如果你通常使用 pathlib,你可能更喜欢 pathlib 的解决方案(并省略 str 的调用)。如果你只需要路径作为字符串,它们两个都可以达到相同的效果。 - Niklas Mertsch
2
@dcolish 请从答案中删除 str()。使用斜杠 / 构建路径更加自然,例如 Path.home() / "location_of_a_file.txt" - Paul Rougieux
显示剩余8条评论

36

我发现pathlib模块也支持这个功能。

from pathlib import Path
>>> Path.home()
WindowsPath('C:/Users/XXX')

20

我知道这个帖子很旧了,但是最近我需要在一个大型项目中使用它(Python 3.8)。它必须在任何主流操作系统上运行,因此我选择了@Max在评论中提供的解决方案。

代码:

import os
print(os.path.expanduser("~"))

输出窗口:

PS C:\Python> & C:/Python38/python.exe c:/Python/test.py
C:\Users\mXXXXX

输出Linux(Ubuntu):

rxxx@xx:/mnt/c/Python$ python3 test.py
/home/rxxx

我还在 Python 2.7.17 上进行了测试,也能正常工作。


8
你的回答和dcolish的回答有何不同? - The Godfather

5

可以使用标准库中的pathlib模块来完成此操作,它将路径视为带有方法的对象,而不是字符串。

  • Path.expanduser():展开路径中的波浪号字符(~),即将路径中的“~”替换为当前用户的主目录。
  • Path.home():返回当前用户的主目录路径。
from pathlib import Path

home: str = str(Path('~').expanduser())

-2

这并不完全符合问题的要求(它被标记为跨平台),但也许对某些人有用。

如何获取有效用户的主目录 (仅适用于Linux)

假设您正在编写安装程序脚本或其他需要您在特定本地用户下执行某些操作的解决方案。您很可能会通过更改有效用户来完成此操作,但os.path.expanduser(“~”)仍将返回/root

参数需要使用所需的用户名:

os.path.expanduser(f"~{USERNAME}/")

请注意,如果不更改EUID,上述内容将正常工作,但如果先前描述的情况适用,则下面的示例显示如何使用它:
import os
import pwd
import grp

class Identity():

    def __init__(self, user: str, group: str = None):
        self.uid = pwd.getpwnam(user).pw_uid
        if not group:
            self.gid = pwd.getpwnam(user).pw_gid
        else:
            self.gid = grp.getgrnam(group).gr_gid

    def __enter__(self):
        self.original_uid = os.getuid()
        self.original_gid = os.getgid()
        os.setegid(self.uid)
        os.seteuid(self.gid)

    def __exit__(self, type, value, traceback):
        os.seteuid(self.original_uid)
        os.setegid(self.original_gid)

if __name__ == '__main__':

    with Identity("hedy", "lamarr"):
        homedir = os.path.expanduser(f"~{pwd.getpwuid(os.geteuid())[0]}/")
        with open(os.path.join(homedir, "install.log"), "w") as file:
            file.write("Your home directory contents have been altered")

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