Как найти реальный домашний каталог пользователя с помощью python?


Я вижу, что если мы изменим переменную среды HOME(linux) или USERPROFILE(windows) и запустим скрипт python, он вернет новое значение как пользователь home, когда я попытался, ОС.environ ['HOME'] ОС.exp

есть ли способ найти реальный домашний каталог пользователя, не полагаясь на переменную среды?

edit:
Вот способ найти userhome в windows, прочитав в registry,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

edit:
Один из способов найти windows home с помощью pywin32,

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

9 ответов:

Я думаю os.path.expanduser(path) может быть полезным.

в Unix и Windows верните аргумент с начальным компонентом ~ или ~user заменяется домашним каталогом этого пользователя.

в Unix, инициал ~ заменяется переменной окружения HOME, если она установлена; в противном случае домашний каталог текущего пользователя просматривается в каталоге паролей через встроенный модуль pwd. исходная ~user ищется прямо в директории паролей.

в Windows, HOME и USERPROFILE будут использоваться, если установлено, в противном случае a сочетание HOMEPATH и HOMEDRIVE будет использоваться. исходная ~user обрабатывается путем удаления последнего компонента каталога из созданного пути пользователя, полученного выше.

если расширение не удается, или если путь не начинается с Тильды, путь возвращается без изменений.

так что вы могли бы просто сделайте:

os.path.expanduser('~user')

Я думаю os.path.expanduser(path) является лучшим ответом на ваш вопрос, но есть альтернатива, которая может быть стоит упомянуть в мире Unix:pwd пакета. например,

import os, pwd

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

home_folder = os.getenv('HOME')

Это должно работать на Windows и Mac OS тоже хорошо работает на Linux.

from pathlib import *

str(Path.home())

работает в Python 3.5 и выше. Path.home() возвращает a Path объект предоставления API Я нахожу очень полезным.

для 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

действительно, изменение переменной среды указывает на то, что дом должен быть изменен. Таким образом, каждая программа/скрипт должна иметь новый дом в контексте; также последствия зависят от человека, который его изменил. Я бы все равно придерживался home = os.getenv('USERPROFILE') or os.getenv('HOME')

что именно требуется?

Я понимаю, что это старый вопрос, на который был дан ответ, но я думал, что добавлю свои два цента. Принятый ответ не работает для меня. Мне нужно было найти каталог пользователя, и я хотел, чтобы он работал с и без sudo. В Linux, мой каталог пользователя является "/Home/someuser на" но мой корневой каталог "//корень". Однако на моем Mac каталог пользователя - "/ Users / someuser". Вот что я в конечном итоге сделал:

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

это работало и С и без sudo на Mac и Линукс.

получить (переведенные) имена папок пользователей в 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)

на Linux и других UNIXoids вы всегда можете заглянуть в /etc/passwd. Домашний каталог-это шестое поле, разделенное двоеточием. Однако нет идеи о том, как сделать лучше, чем переменная среды в Windows. Для этого будет системный вызов, но если он доступен из Python,...