Как найти домашний каталог реального пользователя с помощью python? - PullRequest
61 голосов
/ 19 апреля 2010

Я вижу, что если мы изменим переменную окружения HOME (linux) или USERPROFILE (windows) и запустим скрипт на python, он вернет новое значение в качестве домашнего пользователя, когда я попытался, 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)

Ответы [ 9 ]

77 голосов
/ 19 апреля 2010

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

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

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

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

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

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

os.path.expanduser('~user')
13 голосов
/ 21 июня 2010

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

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir
10 голосов
/ 29 января 2017
from pathlib import *

str(Path.home())

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

5 голосов
/ 07 июля 2010

home_folder = os.getenv('HOME')

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

3 голосов
/ 02 декабря 2015

для окон;

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
1 голос
/ 12 марта 2017

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

1 голос
/ 19 апреля 2010

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

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

0 голосов
/ 23 сентября 2018

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

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

...