Как найти реальный домашний каталог пользователя с помощью 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)
Ответы
Ответ 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,...