ChatGPT解决这个技术问题 Extra ChatGPT

What is the correct cross-platform way to get the home directory in Python?

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 ?

This is marked a duplicate of How to find the real user home directory using python, but I voted to reopen because this answer works on Python 3 and the older answer does not.

A
Arsen Khachaturyan

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())

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
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])
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.
@Dipayan no, that's the Python 2 backport of pathlib. For Python 3, pathlib is correct.
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.
J
Jaeyoon Jeong

I found that pathlib module also supports this.

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

u
user56700

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.


How is your answer different from dcolish's one?
T
Tammi

This doesn't really qualify for the question (it being tagged as cross-platform), but perhaps this could be useful for someone.

How to get the home directory for effective user (Linux specific).

Let's imagine that you are writing an installer script or some other solution that requires you to perform certain actions under certain local users. You would most likely accomplish this in your installer script by changing the effective user, but os.path.expanduser("~") will still return /root.

The argument needs to have the desired user name:

os.path.expanduser(f"~{USERNAME}/")

Note that the above works fine without changing EUID, but if the scenario previously described would apply, the example below shows how this could be used:

import os
import pwd
import grp

class Identity():

    def __init__(self, user: str, group: str = None):
        self.uid = pwd.getpwnam(user).pw_uid
        if not group:
            self.gid = pwd.getpwnam(user).pw_gid
        else:
            self.gid = grp.getgrnam(group).gr_gid

    def __enter__(self):
        self.original_uid = os.getuid()
        self.original_gid = os.getgid()
        os.setegid(self.uid)
        os.seteuid(self.gid)

    def __exit__(self, type, value, traceback):
        os.seteuid(self.original_uid)
        os.setegid(self.original_gid)

if __name__ == '__main__':

    with Identity("hedy", "lamarr"):
        homedir = os.path.expanduser(f"~{pwd.getpwuid(os.geteuid())[0]}/")
        with open(os.path.join(homedir, "install.log"), "w") as file:
            file.write("Your home directory contents have been altered")