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


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.name과 if진술입니다.

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

다른 답변을 기반으로 결합 pwd및 getpass접근 :

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 ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid ) 를 통해 호출하는 것은 약간 번거롭지 만 Windows API를 통해 Windows에서 현재 사용자 이름을 얻을 수 있습니다 .

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

import getuser
print(getuser.lookup_username())

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

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