Существует ли портативный способ получить имя пользователя текущего пользователя в Python (т. Е. Тот, который работает как в Linux, так и в Windows, по крайней мере). Это будет работать так os.getuid
:
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
Я гуглил вокруг и был удивлен, что не нашел окончательного ответа (хотя, возможно, я просто плохо гуглил). Модуль pwd обеспечивает относительно простой способ достижения этого, скажем, в Linux, но его нет в Windows. Некоторые результаты поиска показали, что получение имени пользователя в Windows может быть сложным в определенных обстоятельствах (например, запуск в качестве службы Windows), хотя я этого не проверял.
python
portability
username
Джейкоб Габриэльсон
источник
источник
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos
илиimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
Ответы:
Посмотрите на модуль getpass
Доступность: Unix, Windows
ps На комментарий ниже " эта функция просматривает значения различных переменных среды для определения имени пользователя. Поэтому на эту функцию не следует полагаться в целях контроля доступа (или, возможно, в любых других целях, поскольку она позволяет любому пользователю выдавать себя за любое другое ). "
источник
Лучше всего было бы сочетать
os.getuid()
сpwd.getpwuid()
:Обратитесь к документации по pwd для более подробной информации:
http://docs.python.org/library/pwd.html
источник
pwd.getpwuid(os.getuid()).pw_name
.ImportError: No module named pwd
sudo
правильно обрабатывает случай. (Я знаю, что OP не просил Unix-подобные системы.)Вы также можете использовать:
источник
Вы, вероятно, можете использовать:
или
Но это не будет безопасным, потому что переменные среды могут быть изменены.
источник
os.getenv(...)
не рекомендуется в пользуos.environ[...]
.os.getenv
не кажется устаревшим ..?Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не переносимы, но для этого
os.name
иif
нужны заявления.Смотрите: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
источник
SET USERNAME=FAKE
перед командой pythonЕсли вам это нужно, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (по крайней мере, win32 и linux), частью стандартной библиотеки.
Также вы можете проанализировать такую строку, чтобы получить только последний компонент пути (т.е. имя пользователя).
Смотрите: os.path.expanduser
источник
Для меня использование
os
модуля выглядит лучше всего для переносимости: лучше всего работает как на Linux, так и на Windows.Вывод:
Окна:
Linux:
Нет необходимости устанавливать какие-либо модули или расширения.
источник
Совмещенный
pwd
иgetpass
подход, основанный на других ответах:источник
Для UNIX, по крайней мере, это работает ...
редактировать: я только что посмотрел, и это работает на Windows и UNIX:
В UNIX он возвращает ваше имя пользователя, но в Windows он возвращает группу вашего пользователя, косую черту, ваше имя пользователя.
-
IE
UNIX возвращает: «имя пользователя»
Windows возвращает: «домен / имя пользователя»
-
Это интересно, но, вероятно, не идеально, если вы все равно что-то делаете в терминале ... в этом случае вы, вероятно, будете использовать
os.system
для начала. Например, некоторое время назад мне нужно было добавить своего пользователя в группу, что я и сделал (это в Linux, заметьте)Мне кажется, что это легче читать, и вам не нужно импортировать pwd или getpass.
Я также чувствую, что наличие «домен / пользователь» может быть полезным в некоторых приложениях в Windows.
источник
domain/user
неgroup/user
user = subprocess.check_output("whoami").replace("\r\n", "")
chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid
меня никто не попал . во-вторых,user = subprocess.check_output("whoami").strip()
это более переносимо, чем замена перевода строки выше.commands
vssubprocess
кажется придирчивым, но команды отсутствуют в python 3.Некоторое время назад я написал модуль plx для переноса имени пользователя в Unix и Windows (среди прочего): http://www.decalage.info/en/python/plx
Применение:
(для Windows требуется расширение win32)
источник
Используя только стандартные библиотеки Python:
Работает на Windows, Mac или Linux
В качестве альтернативы, вы можете удалить одну строку с немедленным вызовом:
источник
Вы можете получить текущее имя пользователя в Windows, пройдя через Windows API, хотя вызывать его через FFI ctypes довольно сложно ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid ).
Я написал небольшой модуль, который может сделать это прямо из Python, getuser.py . Применение:
Он работает как в Windows, так и в * nix (последний использует
pwd
модуль, как описано в других ответах).источник