파이썬을 사용하여 실제 사용자 홈 디렉토리를 찾는 방법은 무엇입니까?


81

HOME (linux) 또는 USERPROFILE (windows) 환경 변수를 변경하고 Python 스크립트를 실행하면 시도했을 때 사용자 홈으로 새 값을 반환하는 것을 볼 수 있습니다. os.environ [ 'HOME'] os.exp

환경 변수에 의존하지 않고 실제 사용자 홈 디렉토리를 찾을 수있는 방법이 있습니까?

편집 :
다음은 레지스트리를 읽어 Windows에서 userhome을 찾는 방법입니다.
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

편집 :
pywin32를 사용하여 Windows 집을 찾는 한 가지 방법,

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

유닉스 명령어 (바로 가기)를 체크 아웃 할 수 있습니다 : ~user현재 사용자의 홈 디렉토리로 이동합니다. 창문에는 전혀 모른다.
mAm

이것은 파이썬에서 홈 디렉토리를 얻는 방법 의 중복으로 표시되어야합니다 . 그 질문에 대한 대답은 Python 3에서 작동 하고이 질문은 그렇지 않기 때문입니다.
Dour High Arch

답변:


96

os.path.expanduser(path)도움이 될 것 같아요 .

Unix 및 Windows에서는 해당 사용자의 홈 디렉토리의 초기 구성 요소 ~ 또는 ~user대체 된 인수를 반환합니다 .

Unix에서는 이니셜 ~이 설정되어 있으면 환경 변수 HOME으로 대체됩니다. 그렇지 않으면 현재 사용자의 홈 디렉토리가 내장 모듈을 통해 비밀번호 디렉토리에서 조회 pwd됩니다. 이니셜 ~user은 비밀번호 디렉토리에서 직접 조회됩니다 .

Windows에서 설정하면 HOME 및 USERPROFILE이 사용되며 그렇지 않으면 HOMEPATH 및 HOMEDRIVE조합 이 사용됩니다. 이니셜 ~user은 위에서 파생 된 생성 된 사용자 경로에서 마지막 디렉토리 구성 요소를 제거하여 처리됩니다 .

확장이 실패하거나 경로가 물결표로 시작하지 않으면 경로가 변경되지 않고 반환됩니다.

따라서 다음과 같이 할 수 있습니다.

os.path.expanduser('~user')

3
사실이지만 질문에서와 같이 환경 변수를 변경하면이 방법도 "엉망"됩니다. 자, 왜 그렇게하고 싶은지 말할 수 없습니다. :)
Jakob Borg

1
@calmh : 예, '~user'Linux 및 Windows에서 작동 하는 것을 사용하도록 변경했습니다 (여기서는 테스트 할 Windows가 없기 때문에 100 % 확신 할 수 없습니다;)).
Felix Kling

1
이것은 Linux에서 작동하지만 Windows에서는 작동하지 않습니다. Windows에서는 "C : \ Documents and settings"를 전달 된 사용자 이름에 결합합니다.
asdfg 2010

이것은 "HOME"변수가 잘못된 문제를 해결하지 못합니다. 예를 들어 cadence.com/Community/forums/t/17969.aspx 참조
endolith

1
@asdfg : 제대로 작동하는 것처럼 들립니다. 하지만 처음에는 '~'(추가하는 문자) 대신 '~ user'(정말로 '~ Bob'과 같은 문자가 필요함) 문자열을 전달했기 때문에 처음 시도했을 때 실패했다고 생각했습니다. 현재 사용자).
Jon Coombs 2014 년

17

os.path.expanduser(path)귀하의 질문에 대한 최선의 답변 이라고 생각 하지만 유닉스 세계에서 언급 할 가치가있는 대안이 있습니다. 바로 pwd패키지입니다. 예

import os, pwd

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

1
이것은 사용자의 홈 디렉토리를 원하지만 HOME 환경 변수가 잘못 설정되었을 때 유용합니다. 저자가 언급했듯이 플랫폼 독립적이 아니라 Windows가 아닌 UNIX 용입니다.
user1071847

1
이것은 sudo 호출에서 보존되거나 보존되지 않을 수있는 HOME 환경 변수에 의존하는 것보다 낫습니다. 예 : HOME env. 변수는 Debian 8에서 대상의 사용자로 설정되지만 ( 'sudo'는 'sudo -H'로 작동) Ubuntu 16에서는 유지됩니다 ( 'sudo'는 'sudo -E'로 작동)
Andrei Korostelev

17
from pathlib import *

str(Path.home())

Python 3.5 이상에서 작동합니다. 매우 유용한 API를 제공하는 객체를 Path.home()반환 합니다.Path


1
내부적으로는 pathlib여전히 환경 변수에 의존하므로 특정 질문에 대한 답변이 아닙니다. 보다 일반적인 질문은 모두 중복으로 표시되고 여기를 참조하므로이 답변에 가장 적합한 장소 일 수 있습니다.
Julius Kunze

pathlib는 이제 경로 처리를 위해 라이브러리로 이동합니다! .home ()에 대해 몰랐습니다. 모든 장점을 검토하기 위해 문서를 다시 방문해야합니다. 건배!
PlacidLush

5

home_folder = os.getenv('HOME')

이것은 Windows 및 Mac OS에서도 작동해야하며 Linux에서도 잘 작동합니다.


1
적어도되지는 varible 사촌 win10에서 작동이 이름 HOMEPATH있다
Reishin

@Reishin은 사실이 아닙니다. 방금 테스트했으며 Windows 10 Pro에서 작동합니다. 그 이름으로 찾을 것으로 예상되는 소프트웨어의 양을 감안할 때 환경 변수의 이름을 변덕스럽게 변경할 여유가 없다고 생각합니다.
sm

@sm 여기에서 찾아보십시오 technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx "HOME"변수. 사용자 정의 변수가 있다고해서 모든 ppl이 가지고 있다는 의미는 아닙니다. mingw, cygwin, git shell 등과 같은 가장 일반적으로 설정합니다. 당신은 cmd.exe를 실행하면, 당신은 놀라게 될 것입니다
Reishin

4

창문의 경우;

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

현재 사용자의 홈 디렉토리에 대한 핸들을 제공하고

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

아래 파일에 대한 핸들을 제공합니다.

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

3

실제로 환경 변수가 변경되면 집을 변경해야 함을 나타냅니다. 따라서 모든 프로그램 / 스크립트는 맥락에서 새로운 홈을 가져야합니다. 또한 결과는 변경 한 사람에게 달려 있습니다. 나는 여전히 고집 할 것이다 home = os.getenv('USERPROFILE') or os.getenv('HOME')

정확히 무엇이 필요합니까?


5
Cygwin을 제외하고는 둘 다 일반적으로 정의되며 여러 번 다릅니다.
amphetamachine

3

나는 이것이 답변 된 오래된 질문이라는 것을 알고 있지만 2 센트를 더할 것이라고 생각했습니다. 받아 들여진 대답은 나를 위해 작동하지 않았습니다. 사용자 디렉터리를 찾아야했고 sudo. Linux에서 내 사용자 디렉토리는 "/ home / someuser"이지만 루트 디렉토리는 "/ root /"입니다. 그러나 내 Mac에서 사용자 디렉토리는 "/ Users / someuser"입니다. 내가 한 일은 다음과 같습니다.

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

이것은 sudoMac과 Linux에서 사용하거나 사용하지 않고 모두 작동했습니다 .


내가 아는 당신은 Mac 및 Linux 말했다 있지만 Windows에 _USERNAME있었다 None. 미래의 독자를 위해.
토마스 Fauskanger

pathlib에서 가져 오기 경로; Path.home (). as_posix () # Windows에서도 작동합니다. 본질적으로 Spronck의 방법과 동일하지만 더 자연 스러울 수 있습니다.
mikey

추가하는 것이 Windows와 함께 작동하도록 개선 할 수 or ""있습니까?
PascalVKooten

0

Linux 및 기타 UNIXoid에서는 항상 /etc/passwd. 홈 디렉토리는 콜론으로 구분 된 여섯 번째 필드입니다. Windows의 환경 변수보다 더 잘하는 방법에 대한 아이디어는 없습니다. 이에 대한 시스템 호출이 있지만 Python에서 사용할 수 있다면 ...


1
하지만 그것은 유닉스 (리눅스) 일 뿐이지 않습니까?
반지 전달자

1
@ring-네. 그 효과에 텍스트를 추가했습니다.
Jakob Borg

-1

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)

어떻게 번역 되었습니까?
gerrit

OS 언어로 번역되었습니다.
Axel Schneider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.