Подтвердить что ты не робот

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

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

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

редактировать:
Вот способ найти userhome в Windows, читая в реестре,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

редактировать:
Один из способов найти Windows Home с помощью Pywin32,

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

Ответ 1

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

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

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

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

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

Итак, вы можете просто сделать:

os.path.expanduser('~user')

Ответ 2

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

import os, pwd

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

Ответ 3

from pathlib import *

str(Path.home())

работает в Python 3.5 и выше. Path.home() возвращает объект Path предоставляющий API, который я считаю очень полезным.

Ответ 4

home_folder = os.getenv('HOME')

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

Ответ 5

Для окон;

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

Ответ 6

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

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

Ответ 7

Я понимаю, что это старый вопрос, на который был дан ответ, но я думал, что добавлю свои два цента. Принятый ответ не работал на меня. Мне нужно было найти каталог пользователя, и я хотел, чтобы он работал с и без 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.

Ответ 8

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

Ответ 9

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