974

I need to get the location of the home directory of the current logged-on user. Currently, I've been using the following on Linux:

os.getenv("HOME")

However, this does not work on Windows. What is the correct cross-platform way to do this?

Gerald Schneider
  • 16,520
  • 9
  • 55
  • 76
Nathan Osman
  • 63,773
  • 66
  • 242
  • 344
  • 3
    This is marked a duplicate of [How to find the real user home directory using python](https://stackoverflow.com/questions/2668909/), but I voted to reopen because this answer works on Python 3 and the older answer does not. – Dour High Arch Jun 17 '20 at 18:40
  • The question title should be improved to ask "What is the correct cross-platform way to get the home directory in Python?" – Rich Lysakowski PhD Apr 11 '21 at 01:02

3 Answers3

1757

You want to use os.path.expanduser.
This will ensure it works on all platforms:

from os.path import expanduser
home = expanduser("~")

If you're on Python 3.5+ you can use pathlib.Path.home():

from pathlib import Path
home = str(Path.home())
Arsen Khachaturyan
  • 6,472
  • 4
  • 32
  • 36
dcolish
  • 19,727
  • 1
  • 22
  • 25
  • 53
    it should be noted that if the user is logged on to a domain on windows and has their profile home folder set in active directory then this will report that mapped network folder instead of the local home directory – scape Dec 17 '12 at 19:18
  • Should anyone just want the home directory rather than the user directory, you might try finding the user directory (`ud`) and doing this: `hd=os.sep.join(ud.split(os.sep)[:-1])` – Brōtsyorfuzthrāx Oct 28 '16 at 09:26
  • I have a CLI application running under sudo and this uses root's home directory instead of the sudoer. Solution here: https://stackoverflow.com/questions/5721529/running-python-script-as-root-with-sudo-what-is-the-username-of-the-effectiv – Preston Badeer Jan 10 '17 at 17:22
  • 8
    The `pathlib.Path.home()` is available from Python3.5 onwards (https://docs.python.org/3/library/pathlib.html#pathlib.Path.home) – Ivan De Paz Centeno Oct 04 '17 at 14:24
  • 13
    I wonder why nobody else mentioned it in this question, but if you need to know where another user's home directory is you can use `os.path.expanduser('~username')`. Probably applies only for Linux though. – Max Jun 28 '18 at 11:56
  • you have to import `pathlib2` instead of `pathlib` to do `path.home()` – Dipayan Jun 14 '19 at 22:48
  • 2
    @Dipayan no, that's the Python 2 backport of pathlib. For Python 3, pathlib is correct. – Haystack Jul 16 '19 at 18:08
  • How do I decide which one to use? – deed02392 Jul 31 '19 at 10:11
  • 2
    The result is the same. If you generally are working with pathlib, you may prefer the pathlib solution (and omit the call of `str`). If you just want the path as string, they both do the same. – Niklas Mertsch Aug 15 '19 at 12:31
  • @Tessaracter Yes, both solutions work on Windows and Linux. – MoTSCHIGGE Jan 13 '20 at 16:14
  • @IvanDePazCenteno "from Python3.5 onwards" does not seem to have lasted very long. Doesn't work with Python 3.8.6. – UTF-8 Nov 25 '20 at 10:03
  • Are you sure? Works just fine with 3.9.5 here. – Vampire May 27 '21 at 09:19
7

I know this is an old thread, but I recently needed this for a large scale project (Python 3.8). It had to work on any mainstream OS, so therefore I went with the solution @Max wrote in the comments.

Code:

import os
print(os.path.expanduser("~"))

Output Windows:

PS C:\Python> & C:/Python38/python.exe c:/Python/test.py
C:\Users\mXXXXX

Output Linux (Ubuntu):

rxxx@xx:/mnt/c/Python$ python3 test.py
/home/rxxx

I also tested it on Python 2.7.17 and that works too.

user56700
  • 193
  • 1
  • 7
3

I found that pathlib module also supports this.

from pathlib import Path
>>> Path.home()
WindowsPath('C:/Users/XXX')