Есть ли переносимый способ получить текущее имя пользователя в Python?
Есть ли переносимый способ получить текущее имя пользователя пользователя в Python (то есть тот, который работает как под Linux, так и Windows, по крайней мере). Он будет работать как os.getuid
:
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
Я googled вокруг и был удивлен, чтобы не найти окончательного ответа (хотя, возможно, я плохо искал Google). Модуль pwd обеспечивает относительно простой способ достижения этого, скажем, Linux, но его нет в Windows. Некоторые из результатов поиска предполагали, что получение имени пользователя под Windows может быть затруднено в определенных обстоятельствах (например, выполняется как служба Windows), хотя я еще не подтвердил это.
Ответы
Ответ 1
Посмотрите getpass модуль
import getpass
getpass.getuser()
'kostya'
Доступность: Unix, Windows
p.s. В комментарии ниже "эта функция просматривает значения переменных среды для определения имени пользователя. Поэтому эту функцию нельзя использовать для целей контроля доступа (или, возможно, для любой другой цели, поскольку она позволяет любому пользователю выдавать себя за другое)."
Ответ 2
Лучше всего было бы объединить 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
Ответ 3
Вы также можете использовать:
os.getlogin()
Ответ 4
Вы, вероятно, можете использовать:
os.environ.get('USERNAME')
или же
os.environ.get('USER')
Но это не будет безопасным, потому что переменные среды могут быть изменены.
Ответ 5
Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не переносимы, но для этого предназначены операторы os.name
и if
.
win32api.GetUserName()
win32api.GetUserNameEx(...)
См:http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
Ответ 6
Если вам нужно это, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (win32 и linux как минимум), частью стандартной библиотеки.
>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'
Также вы можете проанализировать такую строку, чтобы получить только последний компонент пути (то есть имя пользователя).
Смотрите: os.path.expanduser
Ответ 7
Мне, используя модуль os
, лучше всего подходит для переносимости: лучше всего работает как на Linux, так и на Windows.
import os
# Gives user home directory
userhome = os.path.expanduser('~')
print "User home Dir: " + userhome
# Gives username by splitting path based on OS
print "username: " + os.path.split(userhome)[-1]
Вывод:
Окна:
Пользовательский дом Dir: C:\Users\myuser
имя пользователя: myuser
Linux:
Пользовательский дом Dir:/root
имя пользователя: root
Не нужно устанавливать какие-либо модули или расширения.
Ответ 8
Комбинированный подход 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 он возвращает вашу группу пользователей, косую черту, ваше имя пользователя.
-
т.е.
UNIX возвращает: "имя пользователя"
Windows возвращает: "domain/username"
-
Это интересно, но, вероятно, не идеально, если вы ничего не делаете в терминале... в этом случае вы, вероятно, используете 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.
Ответ 10
Я написал модуль plx некоторое время назад, чтобы получить имя пользователя переносимым способом в Unix и Windows (среди прочего):
http://www.decalage.info/en/python/plx
Использование:
import plx
username = plx.get_username()
(для Windows требуется расширение win32)
Ответ 11
Вы можете получить текущее имя пользователя в Windows, пройдя через API Windows, хотя это немного громоздко для вызова через ctypes FFI (GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid).
Я написал небольшой модуль, который может сделать это прямо из Python, getuser.py. Использование:
import getuser
print(getuser.lookup_username())
Он работает как с Windows, так и с * nix (последний использует модуль pwd
, как описано в других ответах).
Ответ 12
Использование только стандартных библиотек Python:
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"])()
Ответ 13
Самый простой способ получить текущее имя пользователя - это определенно username
.
pip install username
затем:
import username
print(username())
# your_username
Работает на Linux, MacOS и Windows