关于linux:如何使用python找到真正的用户主目录?

How to find the real user home directory using python?

我看到,如果我们更改home(linux)或userprofile(windows)环境变量并运行python脚本,当我尝试时,它将返回新值作为用户home,os.environ[主页]OX-EXP

是否有任何方法可以在不依赖环境变量的情况下找到真正的用户主目录?

编辑:这里有一种方法可以通过在注册表中读取来在Windows中查找用户主页,http://mail.python.org/pipermail/python-win32/2008-1月/006677.html

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

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


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

On Unix and Windows, return the argument with an initial component of ~ or ~user replaced by that user‘s home directory.

On Unix, an initial ~ is replaced by the environment variable HOME if it is set; otherwise the current user’s home directory is looked up in the password directory through the built-in module pwd. An initial ~user is looked up directly in the password directory.

On Windows, HOME and USERPROFILE will be used if set, otherwise a combination of HOMEPATH and HOMEDRIVE will be used. An initial ~user is handled by stripping the last directory component from the created user path derived above.

If the expansion fails or if the path does not begin with a tilde, the path is returned unchanged.

所以你可以这样做:

1
os.path.expanduser('~user')


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

1
2
3
import os, pwd

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


1
2
3
from pathlib import *

str(Path.home())

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


埃多克斯1〔5〕

这在Windows和Mac操作系统上也应该有效,在Linux上也可以很好地工作。


对于窗户;

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

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

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

会给你一个处理下面的文件;

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

我意识到这是一个已经被回答的老问题,但我想我会加上我的两分钱。接受的回答对我来说不起作用。我需要找到用户目录,我希望它可以与sudo一起使用,也可以不使用sudo。在Linux中,我的用户目录是"/home/someuser",但我的根目录是"/root/"。但是,在我的Mac上,用户目录是"/users/someuser"。我最后做的是:

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

在Mac和Linux上,无论是否使用sudo,这都是有效的。


实际上,环境变量的变化表明必须更改主目录。因此,每个程序/脚本都应该有上下文中的新家;而且后果取决于更改它的人。我还是会坚持江户十一〔一〕号

具体需要什么?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)

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