如何使用python查找真实的用户主目录?


81

我看到,如果我们更改HOME(linux)或USERPROFILE(windows)环境变量并运行python脚本,当我尝试使用os.environ ['HOME'] os.exp时,它将作为用户主目录返回新值。

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

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

编辑:
一种使用pywin32查找Windows Home的方法,

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

您可能需要检出unix命令(快捷方式):~user它会将您带到当前用户的主目录。在窗户上不知道。
mAm

这应该标记为“如何在Python中获取主目录?”的副本因为该问题的可接受答案在Python 3上有效,而该问题却不可行。
Dour High Arch

Answers:


96

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

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

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

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

如果扩展失败,或者路径不是以波浪号开头,则路径将保持不变。

因此,您可以这样做:

os.path.expanduser('~user')

3
是的,但是像问题中那样更改环境变量也将“愚弄”该方法。现在,我不能说为什么要这么做。:)
Jakob Borg 2010年

1
@calmh:是的,我将其更改为'~user'在Linux和Windows上都可以使用的方式(此处我不确定100%,因为我没有Windows可以测试它;))。
Felix Kling 2010年

1
这在Linux中有效,但在Windows中不起作用。在Windows中,它仅将“ C:\ Documents and settings”与所传递的用户名连接在一起。
asdfg 2010年

这不能解决“ HOME”变量错误的问题。例如,请参见cadence.com/Community/forums/t/17969.aspx
endolith 2012年

1
@asdfg:对我来说听起来像它工作正常。但是我也以为它在我第一次尝试时就失败了,因为起初我传递的是文字字符串'〜user'(它确实需要像'〜Bob'之类的文字),而不是仅仅传递'〜'(附加当前用户)。
乔恩·库姆斯

17

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

import os, pwd

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

1
当您需要用户的主目录但HOME环境变量设置错误时,此功能很有用。正如作者指出的那样,它不是平台无关的,而是针对UNIX,而不是Windows。
user1071847

1
这比依靠HOME env变量要好,后者可以在sudo调用中保留或不保留。例如HOME env。变量在Debian 8中设置为目标用户('sudo'充当'sudo -H'),但在Ubuntu 16中保留('sudo'充当'sudo -E')
Andrei Korostelev

16
from pathlib import *

str(Path.home())

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


1
在内部,pathlib仍然依赖于环境变量,因此这不能回答您的特定问题。由于所有较笼统的问题都被标记为重复问题,因此请参考此处,这可能是答案的最佳选择。
Julius Kunze

pathlib是我现在要去处理路径的库!不知道.home()。我将不得不再次访问文档以查看所有优点。干杯!
PlacidLush

5

home_folder = os.getenv('HOME')

这也应该在Windows和Mac OS上工作,在Linux上工作得很好。


1
至少这不适用于win10 coz varible,名称为HOMEPATH
Reishin

@Reishin不太正确,我刚刚对其进行了测试,并且它可以在Windows 10 Pro上运行。考虑到期望通过该名称找到环境变量的软件数量,我真的认为他们无法一时改变环境变量的名称。
SM

@sm,请尝试在此处找到technet.microsoft.com/zh-cn/library/cc749104(v=ws.10).aspx “ HOME”变量。如果您具有自定义变量,则并不意味着所有ppl都拥有它。在最常见的情况下,例如mingw,cygwin,git shell等...为您设置它。但是,如果您运行cmd.exe,您会感到惊讶
Reishin

4

对于窗户;

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

3

实际上,环境变量的更改表示必须更改房屋。因此,每个程序/脚本都应在上下文中有新的家;后果也取决于更改它的人。我仍然会坚持 home = os.getenv('USERPROFILE') or os.getenv('HOME')

到底需要什么?


5
除了Cygwin以外,在这种情况下,两者通常都是定义的,并且有许多不同之处。
amphetamachine,2010年

3

我意识到这是一个已经解决的老问题,但我想我会加两分钱。公认的答案对我不起作用。我需要找到用户目录,我希望它可以在不使用的情况下使用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。对于未来的读者。
托马斯·福斯坎格

从pathlib导入路径;Path.home()。as_posix()#也可以在Windows中使用。Essentailly与Spronck的方法相同,可能更自然。
mikey

使其与Windows一起工作是否会有所改善or ""
PascalVKooten

0

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


1
但这只是Unix(Linux),不是吗?
环形承载者

1
@ring-是的。为此添加了文本。
Jakob Borg 2010年

-1

在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)

翻译如何?
Gerrit

翻译成OS语言。
Axel Schneider
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.