2010-04-19 24 views
51

Veo que si cambiamos la variable de entorno HOME (linux) o USERPROFILE (windows) y ejecutamos un script python, devuelve el nuevo valor como el inicio del usuario cuando lo intenté, os.environ ['HOME'] os .exp¿Cómo encontrar el directorio de inicio del usuario real usando python?

¿Hay alguna manera de encontrar el directorio de inicio del usuario real sin depender de la variable del entorno?

edición:
Aquí es una manera de encontrar USERHOME en ventanas mediante la lectura en el registro,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

edición:
Una forma de encontrar ventanas de su casa usando pywin32,

from win32com.shell import shell,shellcon 
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0) 
+0

Es posible que desee verificar el comando de unix (acceso directo): '~ user' Le lleva al directorio personal del usuario actual. En windows no tengo idea. –

Respuesta

60

Creo que os.path.expanduser(path) podría ser útil.

En Unix y Windows, devuelva el argumento con un componente inicial de ~ o ~user reemplazado por el directorio personal del usuario.

En Unix, una inicial ~ se reemplaza por la variable de entorno HOME si está configurada; de lo contrario, el directorio de inicio del usuario actual se busca en el directorio de contraseñas a través del módulo integrado pwd. Se busca una inicial ~user directamente en el directorio de contraseñas.

En Windows, el hogar y PERFIL_USUARIO se utilizará si se establece, de lo contrario una combinación de HOMEPATH y HOMEDRIVE se utilizará. Un ~user inicial se gestiona eliminando el último componente de directorio de la ruta de usuario creada derivada anteriormente.

Si la expansión falla o si la ruta no comienza con una tilde, la ruta se devuelve sin cambios.

Por lo que sólo podía hacer:

os.path.expanduser('~user') 
+2

Es cierto, pero cambiar la variable de entorno como en la pregunta también "engañará" a este método. Ahora, por qué uno querría hacer eso, no puedo decirlo. :) –

+1

@calmh: Sí, lo cambié para usar ''~ user'' que debería funcionar en Linux y Windows (aquí no estoy 100% seguro porque no tengo Windows para probarlo;)). –

+0

Esto funciona en Linux, pero no en Windows. En Windows simplemente une "C: \ Documents and settings" con el nombre de usuario pasado. – asdfg

-1

En Linux y otros UNIXoids siempre puede echar un vistazo en /etc/passwd. El directorio de inicio es el sexto campo separado por el colon que hay. Sin embargo, no hay idea de cómo hacerlo mejor que la variable de entorno en Windows. Habrá una llamada al sistema, pero si está disponible desde Python, ...

+1

Pero eso solo sería Unix (Linux) ¿no es así? –

+1

@ring - sip. Se agregó texto para ese efecto. –

1

Realmente, un cambio en la variable de entorno indica que la casa debe ser cambiada. Entonces cada programa/script debe tener el nuevo hogar en contexto; también las consecuencias dependen de la persona que lo cambió. Todavía me quedaría con home = os.getenv('USERPROFILE') or os.getenv('HOME')

¿qué se necesita exactamente?

+5

Excepto en Cygwin, en cuyo caso ambos suelen estar definidos y muchas veces diferentes. – amphetamachine

10

creo os.path.expanduser(path) es la mejor respuesta a su pregunta, pero no hay una alternativa que puede valer la pena mencionar en el mundo Unix: el paquete pwd. p.ej.

import os, pwd 

pwd.getpwuid(os.getuid()).pw_dir 
+1

Esto es útil cuando desea el directorio de inicio del usuario, pero la variable de entorno HOME está configurada incorrectamente. Como señaló el autor, no es independiente de la plataforma, sino más bien para UNIX, no para Windows. – user1071847

+1

Esto es mejor que confiar en la variable de entorno HOME que puede conservarse o no en las llamadas sudo. Por ejemplo, HOME env. la variable se establece en el usuario del objetivo en Debian 8 ('sudo' actúa como 'sudo -H') pero se conserva en Ubuntu 16 ('sudo' actúa como 'sudo -E') –

5

home_folder = os.getenv('HOME')

Esto debería funcionar en Windows y Mac OS también funciona bien en Linux.

+0

al menos esto no funciona en win10 coz varible nombre HOMEPATH – Reishin

+0

@Reishin eso no es del todo cierto, acabo de probarlo y funciona en Windows 10 Pro. Realmente no creo que puedan darse el lujo de cambiar el nombre de una variable de entorno por capricho, dada la cantidad de software que espera encontrarlo con ese nombre. –

+0

@ s.m. intente encontrarlo aquí https://technet.microsoft.com/en-us/library/cc749104(v=ws.10).variable aspx "HOME". Si tiene una variable personalizada, eso no significa que todas las personas lo tengan. En el más común, como mingw, cygwin, git shell, etc ... configurándolo para usted. Pero si ejecuta cmd.exe, se sorprendería – Reishin

2

Para ventanas;

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

le dará un identificador para el directorio personal del usuario actual y

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

le dará un identificador a continuación del archivo;

C:\Users\urUserName\Documents\myfile.txt 
3
from pathlib import * 

str(Path.home()) 

obras en Python 3.5 o superior. Path.home() devuelve un objeto Path proporcionando un API Me resulta muy útil.

+0

Internamente, 'pathlib' aún depende de variables de entorno, por lo que no responde a su pregunta específica. Dado que las preguntas más generales se marcaron como duplicadas y se refieren a aquí, este podría ser el mejor lugar para esta respuesta. –

1

Me doy cuenta de que esta es una vieja pregunta que ha sido respondida, pero pensé que iba a agregar mis dos centavos. La respuesta aceptada no funcionó para mí. Necesitaba encontrar el directorio de usuario y quería que funcionara con y sin sudo. En Linux, mi directorio de usuario es "/ home/someuser" pero mi directorio raíz es "/ root /". Sin embargo, en mi Mac, el directorio de usuario es "/ Users/someuser". Esto es lo que terminé haciendo:

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

Esto funcionó con y sin sudo en Mac y Linux.

+0

Esta es la respuesta correcta real. – PascalVKooten

+0

Sé que dijiste Mac y Linux, pero en Windows '' _USERNAME'' era '' Ninguno''. Para futuros lectores. –

Cuestiones relacionadas