如何使用Python找到真实用户主目录?

99 投票
9 回答
60235 浏览
提问于 2025-04-15 21:47

我发现如果我们改变了 HOME(在Linux上)或者 USERPROFILE(在Windows上)这个环境变量,然后运行一个Python脚本,它会返回新的值作为用户的主目录。

os.environ['HOME']
os.exp

有没有什么方法可以在不依赖环境变量的情况下找到真实的用户主目录呢?

补充:
这里有一种通过读取注册表在Windows上找到用户主目录的方法,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

补充:
还有一种使用pywin32找到Windows主目录的方法,

from win32com.shell import shell,shellcon
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)

9 个回答

18

我觉得 os.path.expanduser(path) 是你问题的最佳答案,但在Unix系统中,还有一个值得提及的替代方案:pwd 这个包。例如:

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir
38
from pathlib import Path

str(Path.home())

这个在Python 3.5及以上版本中可以用。Path.home()会返回一个Path对象,这个对象提供了一个我觉得非常实用的接口

115

我觉得 os.path.expanduser(path) 这个函数可能会很有用。

在Unix和Windows系统中,这个函数会把路径中以 ~~user 开头的部分替换成对应用户的主目录。

在Unix系统中,如果路径以 ~ 开头,它会用环境变量 HOME 的值来替换;如果没有设置这个变量,就会通过内置模块 pwd 查找当前用户的主目录。而以 ~user 开头的路径会直接在密码目录中查找。

在Windows系统中,如果设置了 HOME 和 USERPROFILE,这两个变量会被使用;如果没有设置,就会用 HOMEPATH 和 HOMEDRIVE 的组合而以 ~user 开头的路径会通过去掉上面生成的用户路径中的最后一个目录来处理。

如果替换失败,或者路径不是以波浪号开头,那么这个路径会保持不变。

所以你可以直接这样做:

os.path.expanduser('~user')

撰写回答