690

是否有一种可移植的方式在 Python 中获取当前用户的用户名(即,至少在 Linux 和 Windows 下都可以使用)。它会像这样工作os.getuid

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

我四处搜索,很惊讶没有找到明确的答案(尽管也许我只是在谷歌上搜索得很糟糕)。pwd模块提供了一种相对简单的方法来实现这一点,例如,Linux,但它不存在于 Windows 上。一些搜索结果表明,在某些情况下(例如,作为 Windows 服务运行),在 Windows 下获取用户名可能会很复杂,尽管我尚未对此进行验证。

4

14 回答 14

984

查看getpass模块

import getpass
getpass.getuser()
'kostya'

可用性:Unix、Windows


ps 根据下面的评论“此函数查看各种环境变量的值以确定用户名。因此,不应依赖此函数用于访问控制目的(或可能任何其他目的,因为它允许任何用户冒充任何其他)。

于 2009-05-08T22:30:51.030 回答
148

你最好的选择是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

于 2010-05-24T17:53:51.867 回答
113

您还可以使用:

 os.getlogin()
于 2009-10-20T13:00:12.223 回答
88

您可能可以使用:

os.environ.get('USERNAME')

或者

os.environ.get('USER')

但这并不安全,因为可以更改环境变量。

于 2009-05-08T22:35:54.733 回答
25

这些可能会起作用。我不知道它们在作为服务运行时的行为。它们不可移植,但这就是os.nameif语句的用途。

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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

于 2010-01-02T21:35:30.767 回答
22

如果您需要它来获取用户的主目录,下面可以被认为是可移植的(至少是 win32 和 linux),是标准库的一部分。

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

您也可以解析此类字符串以仅获取最后一个路径组件(即用户名)。

请参阅:os.path.expanduser

于 2013-02-09T01:23:29.800 回答
17

对我来说,使用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]           

输出:

视窗:

用户的主目录:C:\Users\myuser

用户名:myuser

Linux:

用户主目录:/root

用户名:root

无需安装任何模块或扩展。

于 2013-12-05T14:39:01.947 回答
12

结合pwdgetpass方法,基于其他答案:

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()
于 2013-11-08T17:47:29.550 回答
10

psutil提供了一种可移植的方式,它不像getpass解决方案那样使用环境变量。它不太容易出现安全问题,并且可能是今天公认的答案。

import psutil

def get_username():
    return psutil.Process().username()

在底层,这结合了getpwuid基于 unix 的GetTokenInformation方法和 Windows 的方法。

于 2020-12-09T20:10:50.393 回答
7

至少对于 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 中的某些应用程序有所帮​​助。

于 2014-09-16T17:31:25.180 回答
6

仅使用标准 python 库:

from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()

适用于 Windows(如果您在驱动器 C 上)、Mac 或 Linux

或者,您可以立即调用删除一行:

from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()
于 2019-05-13T13:47:17.570 回答
3

我前段时间编写了 plx 模块,以便在 Unix 和 Windows 上以可移植的方式获取用户名(除其他外): http: //www.decalage.info/en/python/plx

用法:

import plx

username = plx.get_username()

(它需要 Windows 上的 win32 扩展)

于 2010-02-04T19:52:09.073 回答
3

您可以通过 Windows API 获取 Windows 上的当前用户名,尽管通过 ctypes FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid ) 调用有点麻烦。

我编写了一个可以直接从 Python 执行此操作的小模块getuser.py。用法:

import getuser
print(getuser.lookup_username())

它适用于 Windows 和 *nix(后者使用pwd其他答案中描述的模块)。

于 2013-11-20T08:12:32.520 回答
3

以上都不适用于我的情况(向下滚动到实际解决方案)。
我在所有解决方案中遇到的问题是使用以下命令运行命令时用户名错误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_USERUSER给出错误的结果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!
于 2021-04-28T11:47:55.670 回答