1145 votes

Quelle est la bonne méthode multiplateforme pour obtenir le répertoire d'origine en Python ?

J'ai besoin d'obtenir l'emplacement du répertoire personnel de l'utilisateur actuellement connecté. Actuellement, j'utilise ce qui suit sur Linux :

os.getenv("HOME")

Toutefois, cela ne fonctionne pas sous Windows. Quelle est la bonne méthode multiplateforme pour faire cela ?

6 votes

Il s'agit d'un duplicata de Comment trouver le répertoire d'origine de l'utilisateur réel en utilisant python mais j'ai voté pour la réouverture parce que cette réponse fonctionne sur Python 3 et que l'ancienne réponse ne fonctionne pas.

0 votes

Le titre de la question devrait être amélioré pour demander "Quelle est la manière correcte et multiplateforme d'obtenir le répertoire d'origine en Python ?".

1998voto

dcolish Points 3814

Vous voulez utiliser os.path.expanduser .
Cela permettra de s'assurer qu'il fonctionne sur toutes les plateformes :

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

Si vous êtes sur Python 3.5 et plus vous pouvez utiliser pathlib.Path.home() :

from pathlib import Path
home = str(Path.home())

63 votes

Il convient de noter que si l'utilisateur est connecté à un domaine sous Windows et que le dossier de base de son profil est défini dans Active Directory, le rapport indiquera le dossier réseau mappé au lieu du répertoire de base local.

0 votes

Si quelqu'un veut simplement le répertoire personnel plutôt que le répertoire utilisateur, vous pouvez essayer de trouver le répertoire utilisateur ( ud ) et faire ceci : hd=os.sep.join(ud.split(os.sep)[:-1])

0 votes

J'ai une application CLI qui s'exécute sous sudo et qui utilise le répertoire personnel de Root au lieu du sudoer. Solution ici : stackoverflow.com/questions/5721529/

28voto

Jaeyoon Jeong Points 31

J'ai trouvé que le module pathlib supporte aussi cela.

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

16voto

user56700 Points 193

Je sais que c'est un vieux sujet, mais j'en ai récemment eu besoin pour un projet à grande échelle (Python 3.8). Il devait fonctionner sur n'importe quel système d'exploitation grand public, et j'ai donc choisi la solution proposée par @Max dans les commentaires.

Code :

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

Fenêtres de sortie :

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

Sortie Linux (Ubuntu) :

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

Je l'ai également testé sur Python 2.7.17 et cela fonctionne aussi.

-2voto

Tammi Points 56

Cela n'entre pas vraiment dans le cadre de la question (cela étant étiqueté comme cross-platform ), mais peut-être que cela peut être utile à quelqu'un.

Comment obtenir le répertoire d'origine de efficace utilisateur (spécifique à Linux) .

Imaginons que vous écriviez un installateur script ou une autre solution qui nécessite d'effectuer certaines actions sous certains utilisateurs locaux. Vous accompliriez très probablement cela dans votre installateur script en changeant l'utilisateur effectif, mais os.path.expanduser("~") retournera toujours /root .

L'argument doit comporter le nom d'utilisateur souhaité :

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

Notez que ce qui précède fonctionne bien sans changer l'EUID, mais si le scénario décrit précédemment s'applique, l'exemple ci-dessous montre comment cela pourrait être utilisé :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X