Python에서 현재 사용자 이름을 가져 오는 이식 가능한 방법이 있습니까?
Python에서 현재 사용자의 사용자 이름을 가져올 수있는 휴대용 방법이 있습니까 (예 : 적어도 Linux와 Windows에서 모두 작동하는 사용자 이름). 다음과 같이 작동합니다 os.getuid
.
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
나는 주위를 훑어 보았고 확실한 대답을 찾지 못한 것에 놀랐습니다 (아마도 인터넷 검색이 좋지 않았지만). PWD 모듈은 리눅스를,이 아래를 달성 말을 상대적으로 쉬운 방법을 제공하지만, 윈도우에 존재하지 않습니다. 일부 검색 결과는 Windows에서 사용자 이름을 얻는 것이 특정 상황 (예 : Windows 서비스로 실행)에서 복잡 할 수 있다고 제안했지만 확인하지는 않았습니다.
getpass 모듈 살펴보기
import getpass
getpass.getuser()
'kostya'
가용성 : Unix, Windows
ps Per comment below " 이 함수는 사용자 이름을 결정하기 위해 다양한 환경 변수의 값을 확인합니다. 따라서이 함수는 액세스 제어 목적 (또는 다른 사용자를 가장 할 수있는 다른 목적)에 의존해서는 안됩니다. ). "
다음 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
다음을 사용할 수도 있습니다.
os.getlogin()
다음을 사용할 수 있습니다.
os.environ.get('USERNAME')
또는
os.environ.get('USER')
그러나 환경 변수가 변경 될 수 있으므로 안전하지 않습니다.
작동 할 수 있습니다. 서비스로 실행할 때 어떻게 작동하는지 모르겠습니다. 그것들은 이식 가능하지 않지만, 그것이 무엇 을위한 os.name
것이고 if
진술을위한 것입니다.
win32api.GetUserName()
win32api.GetUserNameEx(...)
참조 : http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
사용자의 홈 디렉토리를 얻기 위해 이것이 필요하다면, 아래는 표준 라이브러리의 일부인 이식 가능 (최소한 win32 및 linux)으로 간주 될 수 있습니다.
>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'
또한 이러한 문자열을 구문 분석하여 마지막 경로 구성 요소 (예 : 사용자 이름) 만 가져올 수 있습니다.
참조 : os.path.expanduser
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]
산출:
Windows :
사용자의 홈 디렉토리 : C : \ Users \ myuser
사용자 이름 : myuser
Linux :
사용자의 홈 디렉토리 : / root
사용자 이름 : 루트
모듈이나 확장을 설치할 필요가 없습니다.
다른 답변을 기반으로 결합 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()
UNIX의 경우 적어도 이것은 작동합니다 ...
import commands
username = commands.getoutput("echo $(whoami)")
print username
편집 : 나는 그것을 찾아 보았고 이것은 Windows와 UNIX에서 작동합니다.
import commands
username = commands.getoutput("whoami")
On UNIX it returns your username, but on Windows, it returns your user's group, slash, your username.
--
I.E.
UNIX returns: "username"
Windows returns: "domain/username"
--
It's interesting, but probably not ideal unless you are doing something in the the terminal anyway... in which case you would probably be using os.system
to begin with. For example, a while ago I needed to add my user to a group, so I did (this is in Linux, mind you)
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"
I feel like that is easier to read and you don't have to import pwd or getpass.
I also feel like having "domain/user" could be helpful in certain applications in Windows.
I wrote the plx module some time ago to get the user name in a portable way on Unix and Windows (among other things): http://www.decalage.info/en/python/plx
Usage:
import plx
username = plx.get_username()
(it requires win32 extensions on Windows)
You can get the current username on Windows by going through the Windows API, although it's a bit cumbersome to invoke via the ctypes FFI (GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid).
I wrote a small module that can do this straight from Python, getuser.py. Usage:
import getuser
print(getuser.lookup_username())
It works on both Windows and *nix (the latter uses the pwd
module as described in the other answers).
Using only standard python libs:
from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()
Works on Windows, Mac or Linux
Alternatively, you could remove one line with an immediate invocation:
from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()
'Program Tip' 카테고리의 다른 글
Java 용 소멸자가 있습니까? (0) | 2020.10.03 |
---|---|
Entity Framework의 SqlException-세션에서 실행중인 다른 스레드가 있으므로 새 트랜잭션이 허용되지 않습니다. (0) | 2020.10.03 |
Bash의 'if'문에서 두 문자열 변수를 어떻게 비교합니까? (0) | 2020.10.03 |
Java의 foreach 루프에서 제거 호출 (0) | 2020.10.03 |
주어진 인덱스에서 요소별로 목록 / 튜플을 정렬 (목록 / 튜플)하는 방법은 무엇입니까? (0) | 2020.10.03 |