Есть ли портативный способ получить текущее имя пользователя в 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 для более подробной информации:
Вы, вероятно, можете использовать:
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 несколько затруднительно ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid).
Я написал небольшой модуль, который может сделать это прямо из 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"))