Как найти реальный домашний каталог пользователя с помощью 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 ответов:
Я думаю
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()
возвращает aPath
объект предоставления 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)