Як знайти домашній каталог реального користувача за допомогою python?


81

Я бачу, що якщо ми змінимо змінну середовища HOME (linux) або USERPROFILE (windows) і запустимо скрипт python, він поверне нове значення як домашній користувач, коли я спробував, os.environ ['HOME'] os.exp

Чи є спосіб знайти справжній домашній каталог користувача, не покладаючись на змінну середовища?

редагувати:
Ось спосіб знайти користувальницький дім у Windows, прочитавши в реєстрі,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

редагувати:
Один із способів знайти вікно вдома за допомогою pywin32,

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

Можливо, ви захочете перевірити команду unix (ярлик): ~userвона переведе вас до домашнього каталогу поточного користувача. Про вікна поняття не маю.
mAm

Це має бути позначено дублікатом Як отримати домашній каталог у Python? оскільки прийнята відповідь на це питання працює на Python 3, а це питання ні.
Dour High Arch

Відповіді:


96

Я думаю, це os.path.expanduser(path)може бути корисним.

У Unix та Windows поверніть аргумент з початковим компонентом ~ або~user заміненим домашнім каталогом цього користувача.

У Unix ініціал ~замінюється змінною середовища HOME, якщо вона встановлена; інакше домашній каталог поточного користувача шукається в каталозі паролів через вбудований модуль pwd. Ініціал ~userшукається безпосередньо в каталозі паролів .

У Windows застосовуватимуть HOME та USERPROFILE, якщо встановлено, інакше буде використано комбінацію HOMEPATH та HOMEDRIVE . Ініціал ~userобробляється шляхом вилучення останнього компонента каталогу зі створеного вище шляху користувача .

Якщо розширення не вдається або шлях не починається з тильди, шлях повертається незмінним.

Отже, ви можете просто зробити:

os.path.expanduser('~user')

3
Правда, але зміна змінної середовища, як у питанні, також "обдурить" цей метод. Зараз, чому б хтось хотів це зробити, я не можу сказати. :)
Якоб Борг,

1
@calmh: Так, я змінив його на використання, '~user'яке повинно працювати в Linux та Windows (тут я не впевнений на 100%, оскільки у мене немає Windows для тестування;)).
Фелікс Клінг,

1
Це працює в Linux, але не в Windows. У Windows він просто приєднується до "C: \ Documents and settings" до переданого імені користувача.
asdfg

Це не вирішує проблему помилки змінної "HOME". Див. Cadence.com/Community/forums/t/17969.aspx, наприклад
ендоліт

1
@asdfg: Мені здається, що це спрацювало правильно. Але я теж думав, що це не вдалося з першого разу, коли я спробував, тому що спочатку я передавав буквальний рядок '~ user' (що насправді має бути чимось буквальним, наприклад, '~ Bob'), а не просто '~' (що додається поточний користувач).
Джон Кумбс,

17

Я думаю, що os.path.expanduser(path)це найкраща відповідь на ваше запитання, але є альтернатива, про яку варто згадати у світі Unix: pwdпакет. напр

import os, pwd

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

1
Це корисно, коли ви хочете домашній каталог користувача, але змінна середовища HOME встановлена ​​неправильно. Як зазначив автор, він не є незалежним від платформи, а скоріше для UNIX, а не для Windows.
user1071847

1
Це краще, ніж покладатися на змінну HOME env, яка може або не може бути збережена у викликах sudo. Наприклад HOME env. змінна встановлена ​​для користувача цілі в Debian 8 ("sudo" діє як "sudo -H"), але зберігається в Ubuntu 16 ("sudo" діє як "sudo -E")
Андрій Коростєлєв,

17
from pathlib import *

str(Path.home())

працює на Python 3.5 і вище. Path.home()повертає Pathоб'єкт, що надає API, який я вважаю дуже корисним.


1
Внутрішньо pathlibвсе ще покладається на змінні середовища, тому це не відповідає на ваше конкретне запитання. Оскільки загальні питання були позначені як дублікати і посилаються тут, це може бути найкращим місцем для цієї відповіді.
Джуліус Кунце

pathlib - це мій перехід до бібліотеки для обробки шляхів зараз! Не знав про .home (). Мені доведеться ще раз переглянути документи, щоб переглянути все добро. На здоров’я!
PlacidLush

5

home_folder = os.getenv('HOME')

Це повинно працювати і на Windows, і на Mac OS, добре працює на Linux.


1
принаймні це не працює на змінну win10 coz має назву
HOMEPATH

@Reishin це не зовсім вірно, я просто тестував його, і він працює на Windows 10 Pro. Я насправді не думаю, що вони можуть дозволити собі змінити назву змінної середовища на примху, враховуючи кількість програмного забезпечення, яке сподівається знайти її під цим ім’ям.
см

@sm ласка , спробуйте знайти тут technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx «HOME» змінної. Якщо у вас є спеціальна змінна, це не означає, що її мають усі приватні особи. Найчастіше, наприклад, як mingw, cygwin, git shell тощо ..., налаштовуючи його для вас. Але якщо ви запустите cmd.exe, ви були б здивовані
Рейшин

4

Для вікон;

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

3

Справді, зміна змінної середовища вказує на те, що будинок потрібно змінити. Отже, кожна програма / сценарій повинен мати новий будинок у контексті; також наслідки залежать від особи, яка його змінила. Я б все одно дотримувався home = os.getenv('USERPROFILE') or os.getenv('HOME')

що саме потрібно?


5
За винятком Cygwin, в цьому випадку обидва зазвичай визначаються і багаторазово відрізняються.
амфетамахін

3

Я розумію, що це давнє запитання, на яке відповіли, але я подумав, що додам свої два центи. Прийнята відповідь не працювала для мене. Мені потрібно було знайти каталог користувачів, і я хотів, щоб він працював із і без sudo. У Linux моїм користувацьким каталогом є "/ home / someuser", але моїм кореневим каталогом є "/ root /". Однак на моєму Mac директорією користувача є "/ Users / someuser". Ось що я закінчив робити:

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

Це працювало як з sudoMac OS, так і без нього .


Я знаю, ви сказали Mac і Linux, але на Windows _USERNAMEбуло None. Для майбутніх читачів.
Томас Фаускангер

із шляху імпорту pathlib; Path.home (). As_posix () # працює і в Windows. По суті такий же, як метод Спронка, він може бути більш природним.
mikey

Чи було б покращенням зробити роботу з вікнами - це додати or ""?
PascalVKooten

0

У Linux та інших UNIXoids ви завжди можете заглянути /etc/passwd. Домашній каталог - шосте розділене двокрапкою поле там. Немає уявлення про те, як зробити краще, ніж змінна середовища в Windows. Буде системний виклик для цього, але якщо він доступний від Python, ...


1
Але це був би лише Unix (Linux), чи не так?
носій кільця

1
@ring - так. Додано текст для цього.
Якоб Борг,

-1

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

переклали як?
gerrit

Перекладено на мову ОС.
Аксель Шнайдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.