如何使用python找到真正的用户主目录?

Posted

技术标签:

【中文标题】如何使用python找到真正的用户主目录?【英文标题】:How to find the real user home directory using python? 【发布时间】:2011-02-09 18:24:04 【问题描述】:

我看到如果我们更改 HOME (linux) 或 USERPROFILE (windows) 环境变量并运行 python 脚本,它会在我尝试时返回新值作为用户主页

os.environ['HOME']
os.exp

有没有什么方法可以不依赖环境变量找到真正的用户主目录?

编辑: 这是一种通过读取注册表在windows中找到userhome的方法,http://mail.python.org/pipermail/python-win32/2008-January/006677.html

编辑: 一种使用 pywin32 查找 windows home 的方法,

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

【问题讨论】:

您可能需要查看 unix 命令(快捷方式):~user 它会将您带到当前用户的主目录。在windows上不知道。 这应该被标记为 How to get the home directory in Python? 的副本,因为该问题的已接受答案适用于 Python 3,而该问题则不适用。 【参考方案1】:

在 Linux 和其他 UNIXoid 上,您可以随时查看 /etc/passwd。主目录是其中的第六个以冒号分隔的字段。虽然不知道如何比 Windows 上的环境变量做得更好。会有一个系统调用,但如果它可以从 Python 获得,...

【讨论】:

但这只会是 Unix(Linux) 不是吗? @ring - 是的。为该效果添加了文本。【参考方案2】:

真的,环境变量的变化表明家必须改变。所以每个程序/脚本都应该在上下文中有新的家;后果也取决于改变它的人。 我仍然会坚持 home = os.getenv('USERPROFILE') or os.getenv('HOME')

究竟需要什么?

【讨论】:

在 Cygwin 上除外,在这种情况下,两者通常都已定义,而且很多时候都不同。【参考方案3】:

我认为os.path.expanduser(path) 可能会有所帮助。

在 Unix 和 Windows 上,返回带有 ~~user 的初始组件的参数,替换为该用户的主目录。

在 Unix 上,如果设置了环境变量 HOME,则初始 ~ 将被替换;否则通过内置模块pwd在密码目录中查找当前用户的主目录。 直接在密码目录中查找初始~user

在 Windows 上,如果设置了 HOME 和 USERPROFILE,则将使用,否则将使用 HOMEPATH 和 HOMEDRIVE 的组合初始~user 是通过从上面派生的创建的用户路径中剥离最后一个目录组件来处理的

如果扩展失败或路径不以波浪号开头,则路径原封不动地返回。

所以你可以这样做:

os.path.expanduser('~user')

【讨论】:

是的,但是在问题中更改环境变量也会“愚弄”这种方法。现在,为什么要这样做,我不能说。 :) @calmh:是的,我将其更改为使用'~user',它应该可以在 Linux 和 Windows 上运行(这里我不能 100% 确定,因为我没有 Windows 来测试它;))。 这适用于 Linux,但不适用于 Windows。在 Windows 中,它只是将“C:\Documents and settings”加入到传递的用户名中。 这并不能解决“HOME”变量错误的问题。以cadence.com/Community/forums/t/17969.aspx 为例 @asdfg :在我看来它工作正常。但我也认为它在我第一次尝试时失败了,因为起初我传递的是文字字符串'~user'(它确实需要是文字,如'~Bob')而不是'~'(附加当前用户)。【参考方案4】:

我认为os.path.expanduser(path) 是您问题的最佳答案,但在 Unix 世界中可能有一个值得一提的替代方案:pwd 包。例如

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir

【讨论】:

这在您想要用户的主目录但 HOME 环境变量设置不正确时很有用。正如作者所指出的,它不是独立于平台的,而是适用于 UNIX,而不是 Windows。 这比依赖 HOME 环境变量要好,后者可能会或可能不会在 sudo 调用中保留。例如 HOME 环境。变量在 Debian 8 中设置为目标用户('sudo' 充当'sudo -H'),但在 Ubuntu 16 中保留('sudo' 充当'sudo -E')【参考方案5】:

home_folder = os.getenv('HOME')

这应该也适用于 Windows 和 Mac OS,适用于 Linux。

【讨论】:

至少这不适用于 win10 因为变量的名称为 HOMEPATH @Reishin 这不太正确,我刚刚对其进行了测试,它可以在 Windows 10 Pro 上运行。考虑到希望通过该名称找到环境变量的软件数量,我真的认为他们不能一时兴起更改环境变量的名称。 @s.m.请尝试在这里找到technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx“HOME”变量。如果您有自定义变量,那并不意味着所有 ppl 都拥有它。在最常见的情况下,例如 mingw、cygwin、git shell 等……为您设置。但是如果你运行cmd.exe,你会感到惊讶【参考方案6】:

对于窗户;

import os
homepath = os.path.expanduser(os.getenv('USERPROFILE'))

将为您提供当前用户主目录的句柄和

filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt'

将为您提供以下文件的句柄;

C:\Users\urUserName\Documents\myfile.txt

【讨论】:

【参考方案7】:
from pathlib import Path

str(Path.home())

适用于 Python 3.5 及更高版本。 Path.home() 返回一个 Path 对象,提供一个 API 我觉得非常有用。

【讨论】:

在内部,pathlib 仍然依赖于环境变量,所以这并不能回答您的具体问题。由于更一般的问题都被标记为重复并在此处引用,因此这可能是此答案的最佳位置。 pathlib 是我现在去图书馆进行路径处理!不知道 .home()。我将不得不再次重新访问文档以查看所有优点。干杯! 使用 pathlib Path.home() 会很好,除非 python 在 Linux 或 Mac 上以 sudo 运行。有没有办法让SUDO_USER 环境变量使用 Path.home() 获取“原始”用户名?如果没有,那么这篇文章似乎是一个解决方案***.com/a/42750492/796858。谢谢!【参考方案8】:

我意识到这是一个已经回答的老问题,但我想我会加两分钱。接受的答案对我不起作用。我需要找到用户目录,我希望它可以在有和没有sudo 的情况下工作。在 Linux 中,我的用户目录是“/home/someuser”,但我的根目录是“/root/”。但是,在我的 Mac 上,用户目录是“/Users/someuser”。这是我最终做的:

_USERNAME = os.getenv("SUDO_USER") or os.getenv("USER") 
_HOME = os.path.expanduser('~'+_USERNAME)

无论有没有sudo,这都适用于 Mac 和 Linux。

【讨论】:

我知道你说的是 Mac 和 Linux,但在 Windows 上 _USERNAMENone。对于未来的读者。 从路径库导入路径; Path.home().as_posix() # 也适用于 Windows。与 Spronck 的方法基本相同,可能更自然。 添加or ""会不会是一个改进,让它与windows一起工作?【参考方案9】:

在 Linux 上获取(翻译的)用户文件夹名称:

from gi.repository import GLib

docs = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOCUMENTS)
desktop = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DESKTOP)
pics = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES)
videos = GLib.get_user_special_dir(GLib.USER_DIRECTORY_VIDEOS)
music = GLib.get_user_special_dir(GLib.USER_DIRECTORY_MUSIC)
downloads = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOWNLOAD)
public = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PUBLIC_SHARE)
templates = GLib.get_user_special_dir(GLib.USER_DIRECTORY_TEMPLATES)

print(docs)
print(desktop)
print(pics)
print(videos)
print(music)
print(downloads)
print(public)
print(templates)

【讨论】:

怎么翻译的? 翻译成操作系统语言。

以上是关于如何使用python找到真正的用户主目录?的主要内容,如果未能解决你的问题,请参考以下文章

从 django 访问用户主目录

如何使用 nodejs 在用户主目录中创建目录?

如何查看linux用户主目录下的文件?

如何在 Windows 上获取用户主目录?

mac osX packageMaker:如何将目标设置为用户主目录?

测试新人如何使用Python代码封装自动化测试的用例?