web-dev-qa-db-fra.com

Comment trouver le répertoire personnel de l'utilisateur réel en utilisant python?

Je vois que si nous modifions la variable d’environnement HOME (linux) ou USERPROFILE (windows) et exécutons un script python, la nouvelle valeur est renvoyée sous le nom d’utilisateur principal lorsque j’ai essayé, .os.exp

Est-il possible de trouver le répertoire de base de l'utilisateur réel sans s'appuyer sur la variable d'environnement?

modifier:
Voici un moyen de trouver userhome dans Windows en lisant dans le registre,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

modifier:
Une façon de trouver Windows Home en utilisant pywin32,

from win32com.Shell import Shell,shellcon
home = Shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)
59
asdfg

Je pense que os.path.expanduser(path) pourrait être utile.

Sous Unix et Windows, renvoyez l’argument avec un composant initial de ~ ou ~user remplacé par le répertoire de base de cet utilisateur.

Sous Unix, un ~ initial est remplacé par la variable d’environnement HOME, si elle est définie; sinon, le répertoire personnel de l’utilisateur actuel est recherché dans le répertoire des mots de passe via le module intégré pwd. Un ~user initial est recherché directement dans le répertoire de mots de passe.

Sous Windows, HOME et USERPROFILE seront utilisés s’ils sont définis, sinon une combinaison de HOMEPATH et HOMEDRIVE sera utilisée. Un ~user initial est traité en supprimant le dernier composant du répertoire du chemin utilisateur créé ci-dessus.

Si le développement échoue ou si le chemin ne commence pas par un tilde, le chemin est renvoyé tel quel.

Donc, vous pouvez juste faire:

os.path.expanduser('~user')
72
Felix Kling

Je pense que os.path.expanduser(path) est la meilleure réponse à votre question, mais il existe peut-être une alternative intéressante dans le monde Unix: le pwd package. par exemple.

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir
12
Brian M. Hunt
from pathlib import *

str(Path.home())

fonctionne en Python 3.5 et supérieur. Path.home() renvoie un objet Path fournissant un API je trouve très utile.

7
Julius Kunze

home_folder = os.getenv('HOME')

Cela devrait fonctionner aussi sur Windows et Mac OS, fonctionne bien sur Linux.

5
user250145

Pour les fenêtres;

import os
homepath = os.path.expanduser(os.getenv('USERPROFILE'))

vous donnera une poignée au répertoire de base de l'utilisateur actuel et 

filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt'

vous donnera un descripteur de fichier ci-dessous;

C:\Users\urUserName\Documents\myfile.txt
2
khawarizmi

Je me rends compte que c’est une vieille question à laquelle on a répondu, mais j’ai pensé ajouter mes deux sous. La réponse acceptée ne fonctionnait pas pour moi. J'avais besoin de trouver le répertoire utilisateur et je voulais qu'il fonctionne avec et sans Sudo. Sous Linux, mon répertoire utilisateur est "/ home/someuser" mais mon répertoire racine est "/ root /". Cependant, sur mon Mac, le répertoire utilisateur est "/ Users/someuser". Voici ce que j'ai fini par faire:

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

Cela fonctionnait avec et sans Sudo sur Mac et Linux.

1
Julien Spronck

En réalité, un changement de variable d'environnement indique que la maison doit être changée. Donc, chaque programme/script devrait avoir la nouvelle maison dans son contexte; aussi les conséquences sont à la personne qui l'a changé. Je voudrais toujours rester avec home = os.getenv('USERPROFILE') or os.getenv('HOME')

qu'est-ce qu'il faut exactement?

1
ring bearer

obtenir les noms de dossiers d'utilisateurs (traduits) sous 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)
0
Axel Schneider

Sous Linux et autres UNIXoids, vous pouvez toujours jeter un coup d’œil dans /etc/passwd. Le répertoire de base est le sixième champ séparé par deux points. Cependant, vous ne savez pas comment faire mieux que la variable d'environnement de Windows. Il y aura un appel système pour cela, mais s'il est disponible à partir de Python, ...

0
Jakob Borg