Есть ли переносимый способ получить текущее имя пользователя в Python?

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

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

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

    11 Solutions collect form web for “Есть ли переносимый способ получить текущее имя пользователя в Python?”

    Посмотрите модуль 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:

    http://docs.python.org/library/pwd.html

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

      os.getlogin() 

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

     os.environ.get('USERNAME') 

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

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

    win32api.GetUserName ()

    win32api.GetUserNameEx (…)

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

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

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

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

    См .: os.path.expanduser

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

    edit: Я просто просмотрел его, и это работает в Windows и UNIX:

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

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

    IE

    UNIX возвращает: «имя пользователя»

    Windows возвращает: «domain / username»

    Это интересно, но, вероятно, не идеально, если вы ничего не делаете в терминале … в этом случае вы, вероятно, будете использовать 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.

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

    Применение:

     import plx username = plx.get_username() 

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

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

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

     import getuser print(getuser.lookup_username()) 

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

      Python - лучший язык программирования в мире.