Есть ли портативный способ получить текущее имя пользователя в Python?

Существует ли переносимый способ получить имя пользователя текущего пользователя в Python (т. Е. Тот, который работает как в Linux, так и в Windows, по крайней мере). Это будет работать как os.getuid:

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

Я гуглил вокруг и был удивлен, что не нашел окончательного ответа (хотя, возможно, я просто плохо гуглил). Модуль pwd обеспечивает относительно простой способ добиться этого, скажем, в Linux, но его нет в Windows. Некоторые результаты поиска показали, что получение имени пользователя в Windows может быть сложным в определенных обстоятельствах (например, запуск в качестве службы Windows), хотя я этого не проверял.

16 ответов

Решение

Посмотрите на модуль getpass

import getpass
getpass.getuser()
'kostya'

Доступность: Unix, Windows


ps В комментариях ниже "эта функция просматривает значения различных переменных среды для определения имени пользователя. Поэтому на эту функцию не следует полагаться в целях контроля доступа (или, возможно, в любых других целях, поскольку она позволяет любому пользователю выдавать себя за любое другое)."

Лучше всего было бы объединить 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')

Но это не будет безопасным, потому что переменные среды могут быть изменены.

Если вам это нужно, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (по крайней мере, win32 и linux), частью стандартной библиотеки.

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

Также вы можете проанализировать такую ​​строку, чтобы получить только последний компонент пути (т. Е. Имя пользователя).

Смотрите: os.path.expanduser

Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не являются переносимыми, но для этого предназначены выражения "os.name" и "if".

win32api.GetUserName ()

win32api.GetUserNameEx (...)

Смотрите: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

psutil предоставляет переносимый способ, который не использует переменные среды, такие как getpassрешение. Он менее подвержен проблемам с безопасностью и, вероятно, должен быть принятым ответом на сегодняшний день.

      import psutil

def get_username():
    return psutil.Process().username()

Под капотом это объединяет getpwuid основанный на unix и GetTokenInformation метод для Windows.

Для меня с помощью 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

Linux:

Дом пользователя Dir: /root

имя пользователя: 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")

В UNIX он возвращает ваше имя пользователя, но в Windows он возвращает группу вашего пользователя, косую черту, ваше имя пользователя.

-

IE

UNIX возвращает: "имя пользователя"

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.

Использование только стандартных библиотек 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"])()

Некоторое время назад я написал модуль plx для переноса имени пользователя в Unix и Windows (среди прочего): http://www.decalage.info/en/python/plx

Использование:

import plx

username = plx.get_username()

(для Windows требуются расширения win32)

В моем случае ничего из вышеперечисленного не сработало (прокрутите вниз до фактического решения).
Проблема, с которой я сталкиваюсь со всеми решениями, - это неправильное имя пользователя при запуске команд с sudo:

  • psutil суть:
      $ python3
>>> import psutil
>>> psutil.Process().username()
'ubuntu' # OK!

$ sudo su
$ python3
>>> import psutil
>>> psutil.Process().username()
'root' # OK!

$ sudo python3
>>> import psutil
>>> psutil.Process().username()
'root' # WRONG, should be ubuntu!
  • getpass решение:
      $ python3
>>> import getpass
>>> getpass.getuser()
'ubuntu' # OK!

$ sudo su
$ python3
>>> import getpass
>>> getpass.getuser()
'root' # OK!

$ sudo python3
>>> import getpass
>>> getpass.getuser()
'root' # WRONG, should be ubuntu!
  • pwd + os.getuid решение:
      $ python3
>>> import os, pwd
>>> pwd.getpwuid( os.getuid() )[ 0 ]
'ubuntu' # OK!

$ sudo su
$ python3
>>> import os, pwd
>>> pwd.getpwuid( os.getuid() )[ 0 ]
'root' # OK!

$ sudo python3
>>> import getpass
>>> getpass.getuser()
'root' # WRONG, should be ubuntu!
  • os.getlogin работает немного иначе, но все равно неверно:
      $ python3
>>> import os
>>> os.getlogin()
'ubuntu' # OK!

$ sudo su
$ python3
>>> import os
>>> os.getlogin()
'ubuntu' # WRONG, should be root!


$ sudo python3
>>> import os
>>> os.getlogin()
'ubuntu' # OK!
  • os.getenv дает те же результаты:
      $ python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!

$ sudo su
$ python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # WRONG, should be root!


$ sudo python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!

Переключение SUDO_USER а также USER дает неправильный результат в sudo python3 дело.

Актуальное решение (непереносимое)

Решение немного сложное и полагается на расположение корневого домашнего каталога по умолчанию, но работает во всех случаях:

      $ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!

$ sudo su
$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'root' #  OK!

$ sudo python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!

Вы можете получить текущее имя пользователя в Windows, пройдя через Windows API, хотя вызывать его с помощью FFI ctypes несколько затруднительно ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid).

Я написал небольшой модуль, который может сделать это прямо из Python, getuser.py. Использование:

import getuser
print(getuser.lookup_username())

Он работает как на Windows, так и на *nix (последний использует pwd модуль, как описано в других ответах).

Самый простой способ получить текущее имя пользователя - это определенно username,

pip install username

затем:

import username

print(username())
# your_username

И есть также username-cli инструмент CLI, чтобы получить ваше имя пользователя, просто:

pip install username-cli

затем:

$ username
# -> your username

Работает на Linux, MacOS и Windows

это работает для меня:

      import os
os.cmd("whoami")
print (os.cmd("whoami"))
Другие вопросы по тегам