파이썬에서 현재 사용자 이름을 얻는 휴대용 방법이 있습니까?


597

파이썬에서 현재 사용자의 사용자 이름을 얻는 이식 가능한 방법이 있습니까 (즉, 적어도 Linux와 Windows에서 작동하는 사용자 이름). 다음과 같이 작동합니다 os.getuid.

>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'

나는 구글을 둘러 보았고 결정적인 대답을 찾지 못하는 것에 놀랐다. PWD 모듈은 리눅스를,이 아래를 달성 말을 상대적으로 쉬운 방법을 제공하지만, 윈도우에 존재하지 않습니다. 검색 결과 중 일부는 Windows에서 사용자 이름을 얻는 것이 특정 상황 (예 : Windows 서비스로 실행)에서 복잡 할 수 있음을 제안했지만, 확인하지는 못했습니다.


Linux 박스에서는 작동하지 않습니다!
리카르도

5
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos또는import pwd, os; print pwd.getpwuid(os.getuid()).pw_name
chown하지

getUserName 메서드 ()는 운영 체제 파이썬 모듈에서 유효한 방법이 아닙니다 : docs.python.org/2.7/library/os.html
매트 Bruzek

17
@MattBruzek 그게 OP의 요점이었습니다. 그는 그러한 함수가 존재한다면 어떻게 호출 될 수 있는지 상상하고있었습니다.
찌르다

답변:


836

에서 봐 getpass 모듈

import getpass
getpass.getuser()
'kostya'

가용성 : 유닉스, 윈도우


ps under comment below " 이 함수는 다양한 환경 변수의 값을보고 사용자 이름을 결정합니다. 따라서이 함수는 액세스 제어 목적 (또는 다른 목적으로는 다른 사용자를 사칭 할 수 있으므로 다른 목적으로 사용해서는 안 됨) ). "


100
이 함수는 다양한 환경 변수의 값을보고 사용자 이름을 결정하는 것으로 보입니다. 따라서이 기능은 액세스 제어 목적 (또는 사용자가 다른 사람을 사칭 할 수 있으므로 다른 목적)에 의존해서는 안됩니다.
Greg Hewgill

25
사용자를 인증한다고 주장하지 않으므로 getpass.getuser ()에는 아무런 문제가 없습니다. 이 기능의 목적은 사용자에게 직접 묻지 않고 사용자가 누구인지 주장하는 것입니다.
Walker Hale IV

7
su를 수행하면 작동하지 않습니다. $는 hithwen $ 스와 줄리아 비밀번호를 $ USER 에코 : $는 $ USER 줄리아 $ 파이썬 에코 >>> 수입 getpass >>> getpass.getuser () 'hithwen'
hithwen

6
@GregHewgill은 매우 좋은 지적을했지만 실제로는 인증되지 않은 간단한 방법으로 사용자 이름을 찾는 데 일부 응용 프로그램이 있습니다. 현재 사용 사례 : 나중에 쉽게 정리할 수 있도록 일부 공유 테스트 리소스에 사용자 이름으로 태그를 지정합니다. (
누가

16
그리고 액세스 제어 목적으로 @GregHewgill에 동의하지만 '다른 목적'에 완전히 동의하지 않습니다. "쉘 스크립트에서 $ USER를 사용하지 마십시오"와 같습니다. 액세스 제어에 대한 장점은 있지만 인증과 관련이없는 다른 용도 가 많이 있습니다.
nevelis

119

가장 좋은 방법은 다음과 결합하는 것 os.getuid()입니다 pwd.getpwuid().

import os
import pwd

def get_username():
    return pwd.getpwuid( os.getuid() )[ 0 ]

자세한 내용은 pwd 문서를 참조하십시오.

http://docs.python.org/library/pwd.html


51
또는 (약간 더보기 좋음) : pwd.getpwuid(os.getuid()).pw_name.
Brian M. Hunt

6
Windows에서 무엇을합니까? 아마도 이것을 시도해 볼 수 있고, 실패하면 엉뚱한 'getpass / env var'메소드로 넘어갑니다.
Jonathan Hartley

2
로그인 여부에 관계없이 사용자 이름을 가져와야하는 경우 올바른 방법입니다.
Derrick Zhang

5
@JonathanHartley :ImportError: No module named pwd
저스틴

1
이 방법은 케이스를 올바르게 처리하기 때문에 Konstantin Tenzin의 답변보다 훨씬 우수한 유닉스 계열 시스템에 sudo있습니다. (OP가 유닉스와 같은 시스템을 요구하지 않았다는 것을 알고있다.)
halloleo

86

다음을 사용할 수도 있습니다.

 os.getlogin()

29
리눅스에서 getlogin ()은 "프로세스의 제어 터미널에 로그인 한 사용자"의 이름을 반환합니다. 따라서 예를 들어 mod_python 응용 프로그램에 제어 터미널이 없으면 실패합니다.
Vebjorn Ljosa 2009

23
Windows에서는 사용할 수 없음
Walker Hale IV

3
su를 사용하면 현재 사용자가 아닌 원래 로그인 한 사용자를 반환합니다.
Trevor Allred

4
Windows에서 작동합니까 ... Python 3.4.1 (v3.4.1 : c0e311e010fc, 2014 년 5 월 18 일, 10:38:22) win32의 [MSC v.1600 32 비트 (Intel)] win32 유형 "help", "copyright", 자세한 내용은 "신용"또는 "라이센스". >>> 수입 OS; os.getlogin () 'JRB'
Naib

5
Python 3.x 용 Windows에서만 사용할 수 있습니다.
Zitrax

71

아마도 다음을 사용할 수 있습니다.

os.environ.get('USERNAME')

또는

os.environ.get('USER')

그러나 환경 변수를 변경할 수 있기 때문에 안전하지 않습니다.


18
os.getenv(...)은 더 이상 사용되지 않습니다 os.environ[...].
Mike Graham

11
USERNAME 대신 USER 여야합니까?
Karl Bartel

7
@MikeGraham os.getenv은 더 이상 사용되지 않는 것 같습니다 ..?
dbr

4
예, 정확히 USER와 USERNAME은 이식성이없는 것이기 때문에 정답을 제공하지 않습니다.
Peter M

2
USERNAME 님은 Windows 용이고, USER 님은 Linux 용입니다
Sabrina

22

이것들은 효과가있을 수 있습니다. 서비스로 실행할 때 이들이 어떻게 작동하는지 모르겠습니다. 그것들은 이식성이 없지만 그것이 목적 os.nameif진술입니다.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

참조 : http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html


30
이 답변은 적어도 (유용하지 않은) 25 투표 upvoted 유닉스 전용 답변만큼 유용합니다.
Tom B

3
> "적어도 유용하다"동의. 아마도 정답은이 둘의 조합 일 것입니다.
Jonathan Hartley

Windows에서 Python 2에 갇혀 있다면 이것이 유일한 안전한 방법입니다. SET USERNAME=FAKE파이썬 명령 전에 실행하면 다른 모든 방법을
속일

21

사용자의 홈 디렉토리를 가져 오기 위해 이것이 필요한 경우 아래는 표준 라이브러리의 일부로 휴대용 (적어도 win32 및 Linux)으로 간주 될 수 있습니다.

>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'

또한 이러한 문자열을 구문 분석하여 마지막 경로 구성 요소 (예 : 사용자 이름) 만 가져올 수 있습니다.

참조 : os.path.expanduser


9
누군가의 홈 디렉토리에 항상 사용자 이름이 반영되는 것은 아닙니다.
dreamlax

리눅스 & 윈도우 모두에서이 작품
사브리나

불행히도 Windows에서 HOME 변수를 설정하면 해당 값이 반환됩니다.
GLRoman

15

os모듈을 사용 하는 것이 이식성에 가장 적합합니다. Linux와 Windows 모두에서 가장 잘 작동합니다.

import os

# Gives user's home directory
userhome = os.path.expanduser('~')          

print "User's home Dir: " + userhome

# Gives username by splitting path based on OS
print "username: " + os.path.split(userhome)[-1]           

산출:

윈도우 :

사용자의 집 Dir : C : \ Users \ myuser

사용자 이름 : myuser

리눅스 :

사용자의 집 Dir : / root

사용자 이름 : root

모듈이나 확장을 설치할 필요가 없습니다.


16
이 솔루션은 영리하지만 항상 사실이 아닌 몇 가지 가정을합니다. Linux에서 사용자 이름이 homedir 경로에 나타나도록 요구하는 제약은 없습니다. 대부분의 경우에 발생하지만 sysadmin은 사용자의 homedir을 원하는대로 설정할 수 있습니다.
Joe Holloway

HOME 변수를 설정하면이 문제가 해결됩니다.
GLRoman

11

다른 답변을 기반으로 결합 pwdgetpass접근 :

try:
  import pwd
except ImportError:
  import getpass
  pwd = None

def current_user():
  if pwd:
    return pwd.getpwuid(os.geteuid()).pw_name
  else:
    return getpass.getuser()

9

UNIX의 경우 적어도 이것이 작동합니다 ...

import commands
username = commands.getoutput("echo $(whoami)")
print username

편집 : 방금 찾아서 Windows 및 UNIX에서 작동합니다.

import commands
username = commands.getoutput("whoami")

UNIX에서는 사용자 이름을 반환하지만 Windows에서는 사용자 그룹, 슬래시 및 사용자 이름을 반환합니다.

-

IE

UNIX는 "username"을 리턴합니다.

Windows는 "도메인 / 사용자 이름"을 반환합니다.

-

어쨌든 터미널에서 무언가를하지 않으면 흥미롭지 만 이상적이지 않을 것입니다 ...이 경우에는 아마도 os.system시작하는 데 사용 됩니다. 예를 들어, 얼마 전에 사용자를 그룹에 추가해야했기 때문에 Linux에 있습니다.

import os
os.system("sudo usermod -aG \"group_name\" $(whoami)")
print "You have been added to \"group_name\"! Please log out for this to take effect"

즉 쉽게 읽을 수 같은 느낌 당신이 수입 PWD 또는 getpass 할 필요가 없습니다.

또한 "도메인 / 사용자"가 Windows의 특정 응용 프로그램에서 도움이 될 수 있다고 생각합니다.


1
창을 반환 domain/user 하지 않습니다group/user
RealHowTo

4
명령 모듈은 Windows에서 작동하지 않습니다. 유닉스 전용 모듈입니다 ( docs.python.org/2/library/commands.html 참조 ). 더 이상 사용되지 않으며 대신 하위 프로세스가 권장됩니다. user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems

케이; 그런 다음 하위 프로세스를 사용 ... jeez
dylnmc

2 개의 비고 commands.whoami는 다른 사용자 이름으로 실행되는 서비스 컨텍스트에서도 훌륭했습니다. 즉 chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid 나는 아무도 없어요 . 둘째, user = subprocess.check_output("whoami").strip() 위의 교체 라인 피드보다 이식성이 뛰어납니다. commandsVS는 subprocessnitpicky 보이지만 명령은 파이썬 3에서 누락
JL Peyret에게

5

나는 유닉스와 윈도우에서 다른 방법으로 사용자 이름을 가져 오기 위해 얼마 전에 plx 모듈을 썼다 : http://www.decalage.info/en/python/plx

용법:

import plx

username = plx.get_username()

(Windows에서는 win32 확장명이 필요합니다)


4

표준 파이썬 라이브러리 만 사용 :

from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()

Windows, Mac 또는 Linux에서 작동

또는 즉시 호출하여 한 줄을 제거 할 수 있습니다.

from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()

1
getpass는 표준 라이브러리입니다.
jodag

win10, python3.7.4에서 나를 위해 작동하지 않습니다. 환경 변수에서 'USER'가 발견되지 않는다고 불평합니다. 어쨌든 getpass가 더 나은 선택이라고 생각합니다.
Rika

3

ctypes FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid ) 를 통해 호출하는 것은 약간 번거롭지 만 Windows API를 통해 Windows에서 현재 사용자 이름을 얻을 수 있습니다 .

파이썬에서 직접 할 수있는 작은 모듈 인 getuser.py을 작성했습니다 . 용법:

import getuser
print(getuser.lookup_username())

Windows와 * nix 모두에서 작동합니다 (후자는 pwd다른 답변에서 설명한대로 모듈을 사용합니다 ).

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