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

时间:2010-04-19 15:59:03

标签: python linux windows directory home-directory

我看到如果我们更改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)

9 个答案:

答案 0 :(得分:75)

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

  

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

     

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

     

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

     

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

所以你可以这么做:

os.path.expanduser('~user')

答案 1 :(得分:13)

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

import os, pwd

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

答案 2 :(得分:9)

from pathlib import *

str(Path.home())

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

答案 3 :(得分:5)

home_folder = os.getenv('HOME')

这也适用于Windows和Mac OS,在Linux上运行良好。

答案 4 :(得分:2)

对于Windows;

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

答案 5 :(得分:1)

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

究竟需要什么?

答案 6 :(得分:1)

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

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

在Mac和Linux上,无论有没有sudo都可以使用。

答案 7 :(得分: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)

答案 8 :(得分:-1)

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