Есть ли портативный способ получить текущее имя пользователя в Python? - PullRequest
540 голосов
/ 09 мая 2009

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

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

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

Ответы [ 12 ]

739 голосов
/ 09 мая 2009

Посмотрите на getpass module

import getpass
getpass.getuser()
'kostya'

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


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

99 голосов
/ 24 мая 2010

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

74 голосов
/ 20 октября 2009

Вы также можете использовать:

 os.getlogin()
59 голосов
/ 09 мая 2009

Вы, вероятно, можете использовать:

os.environ.get('USERNAME')

или

os.environ.get('USER')

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

20 голосов
/ 03 января 2010

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

win32api.GetUserName ()

win32api.GetUserNameEx (...)

См: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

18 голосов
/ 09 февраля 2013

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

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

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

См .: os.path.expanduser

15 голосов
/ 05 декабря 2013

Для меня использование модуля 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

Дом пользователя Dir: C: \ Users \ myuser

имя пользователя: myuser

Linux:

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

имя пользователя: root

Нет необходимости устанавливать какие-либо модули или расширения.

11 голосов
/ 08 ноября 2013

Комбинированный подход 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()
8 голосов
/ 16 сентября 2014

Для UNIX, по крайней мере, это работает ...

import commands
username = commands.getoutput("echo $(whoami)")
print username

редактирование: Я только что посмотрел, и это работает на Windows и UNIX:

import commands
username = commands.getoutput("whoami")

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

-

И.Е.

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.

5 голосов
/ 04 февраля 2010

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

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

import plx

username = plx.get_username()

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

...