84

我看到如果我们更改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 主页的一种方法,

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

9 回答 9

100

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

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

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

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

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

所以你可以这样做:

os.path.expanduser('~user')
于 2010-04-19T16:05:40.960 回答
21
from pathlib import Path

str(Path.home())

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

于 2017-01-28T22:24:34.403 回答
17

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

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir
于 2010-06-21T14:33:53.323 回答
5

home_folder = os.getenv('HOME')

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

于 2010-07-07T14:18:25.823 回答
4

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

究竟需要什么?

于 2010-04-19T16:05:04.623 回答
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
于 2015-12-02T12:44:12.007 回答
4

我意识到这是一个已经回答的老问题,但我想我会加两分钱。接受的答案对我不起作用。我需要找到用户目录,我希望它可以使用和不使用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。

于 2017-03-12T17:12:08.863 回答
0

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

于 2010-04-19T16:04:37.867 回答
0

在 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)
于 2018-09-23T18:02:28.420 回答