Есть ли портативный способ получить текущее имя пользователя в Python?
Существует ли переносимый способ получить имя пользователя текущего пользователя в Python (т. Е. Тот, который работает как в Linux, так и в Windows, по крайней мере). Это будет работать как os.getuid :
>>> os.getuid() 42 >>> os.getusername() 'slartibartfast'
Я гуглил вокруг и был удивлен, что не нашел окончательного ответа (хотя, возможно, я просто плохо гуглил). Модуль pwd обеспечивает относительно простой способ добиться этого, скажем, в Linux, но его нет в Windows. Некоторые результаты поиска показали, что получение имени пользователя в Windows может быть сложным в определенных обстоятельствах (например, запуск в качестве службы Windows), хотя я этого не проверял.
16 ответов
import getpass getpass.getuser() 'kostya'
ps В комментариях ниже «эта функция просматривает значения различных переменных среды для определения имени пользователя. Поэтому на эту функцию не следует полагаться в целях контроля доступа (или, возможно, в любых других целях, поскольку она позволяет любому пользователю выдавать себя за любое другое).«
Лучше всего было бы объединить os.getuid() с pwd.getpwuid() :
import os import pwd def get_username(): return pwd.getpwuid( os.getuid() )[ 0 ]
Обратитесь к документации по pwd для более подробной информации:
Вы также можете использовать:
Вы, вероятно, можете использовать:
Но это не будет безопасным, потому что переменные среды могут быть изменены.
Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не являются переносимыми, но для этого предназначены выражения «os.name» и «if».
Если вам это нужно, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (по крайней мере, win32 и linux), частью стандартной библиотеки.
>>> os.path.expanduser('~') 'C:\\Documents and Settings\\johnsmith'
Также вы можете проанализировать такую строку, чтобы получить только последний компонент пути (т. Е. Имя пользователя).
Для меня с помощью 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
Дом пользователя Dir: /root
имя пользователя: root
Нет необходимости устанавливать какие-либо модули или расширения.
psutil предоставляет переносимый способ, который не использует переменные среды, такие как getpass решение. Он менее подвержен проблемам с безопасностью и, вероятно, должен быть принятым ответом на сегодняшний день.
import psutil def get_username(): return psutil.Process().username()
Под капотом это объединяет getpwuid основанный на unix и GetTokenInformation метод для Windows.
Комбинированный 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 он возвращает группу вашего пользователя, косую черту, ваше имя пользователя.
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 :
$ 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!
$ 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!
$ 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!
$ 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!
$ 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!
Есть ли портативный способ получить текущее имя пользователя в Python?
Существует ли портативный способ получить имя пользователя текущего пользователя в Python (то есть тот, который работает как в Linux, так и в Windows, по крайней мере). Это будет работать как os.getuid :
>>> os.getuid() 42 >>> os.getusername() 'slartibartfast'
Я гуглил вокруг и был удивлен, что не нашел окончательного ответа (хотя, возможно, я просто плохо гуглил). Модуль pwd обеспечивает относительно простой способ достижения этой цели. под, скажем, Linux, но его нет в Windows. Некоторые результаты поиска показали, что получение имени пользователя в Windows может быть сложным в определенных обстоятельствах (например, запуск в качестве службы Windows), хотя я этого не проверял.
12 ответов
import getpass getpass.getuser() 'kostya'
Постскриптум В комментариях ниже « эта функция просматривает значения различных переменных среды для определения имени пользователя. Поэтому на эту функцию не следует полагаться в целях контроля доступа (или, возможно, для любой другой цели, поскольку она позволяет любому пользователю выдавать себя за другого»). любой другой). «
Используя только стандартные библиотеки 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)
Комбинированный подход 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()
Вы также можете использовать:
Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не являются переносимыми, но для этого предназначены операторы os.name и if .
win32api.GetUserName() win32api.GetUserNameEx(. )
Вы, вероятно, можете использовать:
Но это не будет безопасным, потому что переменные среды могут быть изменены.
Если вам это нужно, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (по крайней мере, win32 и linux), частью стандартной библиотеки.
>>> os.path.expanduser('~') 'C:\\Documents and Settings\\johnsmith'
Также вы можете проанализировать такую строку, чтобы получить только последний компонент пути (т.е. имя пользователя).
Для меня использование 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
Дом пользователя Dir: / root
имя пользователя: root
Нет необходимости устанавливать какие-либо модули или расширения.
Лучше всего было бы объединить os.getuid() с pwd.getpwuid() :
import os import pwd def get_username(): return pwd.getpwuid( os.getuid() )[ 0 ]
Обратитесь к документации по pwd для более подробной информации:
Вы можете получить текущее имя пользователя в Windows, пройдя через Windows API, хотя вызывать его немного через FFI ctypes (GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid).
Я написал небольшой модуль, который может сделать это прямо из Python, getuser.py. Применение:
import getuser print(getuser.lookup_username())
Он работает как в Windows, так и в * nix (последний использует модуль pwd , как описано в других ответах).
Для 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.