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)
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')
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
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.
home_folder = os.getenv('HOME')
Cela devrait fonctionner aussi sur Windows et Mac OS, fonctionne bien sur Linux.
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
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.
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?
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)
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, ...