Есть ли переносимый способ получить текущее имя пользователя в 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 (GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid).

Я написал небольшой модуль, который может сделать это прямо из 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