2009-05-08 8 views
456

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

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

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

+0

Это не работает на моей Linux-упаковке! – Riccardo

+2

'import pwd, os; print pwd.getpwuid (os.getuid()). pw_gecos' или 'import pwd, os; print pwd.getpwuid (os.getuid()). pw_name' – chown

+0

getusername() недействителен в модуле os Python: https://docs.python.org/2.7/library/os.html –

ответ

621

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

import getpass 
getpass.getuser() 
'kostya' 

Наличие: Unix, Windows


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

+88

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

+16

Нет ничего плохого в getpass.getuser(), поскольку он не претендует на аутентификацию пользователя. Цель этой функции - определить, кто из пользователей заявляет, что он не спрашивает пользователя напрямую. –

+7

Это не работает, если вы сделали su. $ эхо $ USER hithwen $ су джулия Пароль: $ эхо $ USER джулия $ питона >>> импорт GetPass >>> getpass.getuser() 'hithwen' – hithwen

45

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

os.environ.get('USERNAME') 

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

+13

'os.getenv (...)' устарел в пользу 'os.environ [...]'. –

+9

Разве это не ПОЛЬЗОВАТЕЛЬ вместо USERNAME? –

+6

@MikeGraham ['os.getenv'] (http://docs.python.org/dev/library/os.html#os.getenv) не кажется устаревшим ..? – dbr

60

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

os.getlogin() 
+23

В linux getlogin() возвращает имя пользователя, зарегистрированного на управляющем терминале процесса. Поэтому он не работает, когда нет управляющего терминала, например, в приложении mod_python. –

+14

Недоступно для Windows –

+0

Это работает на окнах 8, 64b, прикрепленных к домену – scape

17

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

win32api.GetUserName()

win32api.GetUserNameEx (...)

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

+2

Er, слово «портативный» находится под вопросом .. – JBRWilkinson

+23

Этот ответ хотя бы так же полезен, как (бесполезный) ответ на 25 голосов с поддержкой unix-only. –

+1

> «По крайней мере, полезно» Согласовано. Предположительно, правильный ответ - это комбинация двух. –

5

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

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

import plx 

username = plx.get_username() 

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

93

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

+34

Альтернативно (немного лучше читать): 'pwd.getpwuid (os.getuid()). Pw_name'. –

+44

Не работает в Windows (как указано в исходном вопросе) – Truan

+3

-1 Не работает в Windows –

14

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

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

См: os.path.expanduser

+3

Домашний каталог Someone не всегда отражает их имя пользователя. – dreamlax

9

Комбинированный 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() 
3

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

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

import getuser 
print(getuser.lookup_username()) 

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

12

Мне нужен модуль 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]   

Выход:

Окна:

User's home Dir: C:\Users\myuser

username: myuser

Linux:

User's home Dir: /root

username: root

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

+9

Это решение является умным, но делает некоторые предположения, которые не всегда верны. Не существует ограничений, которые требуют, чтобы имя пользователя отображалось на пути homedir в Linux. Обычно это происходит в большинстве случаев, но системный администратор может настроить homedir пользователя на все, что захочет. –

6

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

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

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

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

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

-

I.E.

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.

+1

WIndows возвращает 'domain/user' not' group/user' – RealHowTo

+1

Модуль команд не работает в Windows. Это специальный модуль UNIX (см. Https://docs.python.org/2/library/commands.html). Теперь он устарел, а подпроцесс рекомендуется. 'user = subprocess.check_output (" whoami "). Replace (" \ r \ n "," ")' – ConnectedSystems

+0

k; затем используйте подпроцесс ... jeez – dylnmc

Смежные вопросы