有没有一种可移植的方法来获取Python中的当前用户名?


596

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

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

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


它在我的Linux机器上不起作用!
Riccardo 2013年

4
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
chown 2015年

getusername()在os Python模块中不是有效的方法: docs.python.org/2.7/library/os.html
Matt Bruzek

17
@MattBruzek那是OP的重点。他在想像如果存在这样的函数该如何调用。

Answers:


836

看一下getpass模块

import getpass
getpass.getuser()
'kostya'

可用性:Unix,Windows


ps在下面的每个注释中:“ 此函数查看各种环境变量的值以确定用户名。因此,不应出于访问控制目的(或可能出于任何其他目的)依赖此函数,因为它允许任何用户模仿任何其他用户)。


100
看来,此功能会查看各种环境变量的值以确定用户名。因此,不应出于访问控制目的(或可能出于任何其他目的)依赖此功能,因为它允许任何用户模仿其他任何人。
2009年

25
getpass.getuser()没有任何问题,因为它不要求对用户进行身份验证。该功能的目的是在不直接询问用户的情况下确定用户声称的身份。
沃克黑尔四世

7
如果您做了su,那行不通。$ echo $ USER hithwen $ su julia密码:$ echo $ USER julia $ python >>> import getpass >>> getpass.getuser()'hithwen'–
hithwen

6
@GregHewgill提出了一个很好的观点,但是的确,以这种简单的未经身份验证的方式找出用户名确实有一些应用程序。我当前的用例:使用用户名标记一些共享的测试资源,以便以后清除。(因此,更容易弄清谁是谁。)
driftcatcher

16
我同意@GregHewgill用于访问控制目的,但完全不同意“任何其他目的”-就像说“不要在shell脚本中使用$ USER”。关于访问控制的重点,但还有许多其他不涉及身份验证的用途。
nevelis 2014年

119

您最好的选择是与结合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


51
或者(略更好看): pwd.getpwuid(os.getuid()).pw_name
Brian M. Hunt

6
在Windows上做什么?也许可以尝试一下,如果失败了,那就退回到笨拙的“ getpass / env var”方法。
乔纳森·哈特利

2
这是正确的方式,如果您需要既没有在登录来获取用户名。
德里克张

5
@乔纳森ImportError: No module named pwd
·

1
这种方法在类似Konix的系统上优于Konstantin Tenzin的答案,因为它可以sudo正确处理案件。(我知道OP并没有要求类似Unix的系统。)
halloleo

86

您还可以使用:

 os.getlogin()

29
在linux上,getlogin()返回“在进程的控制终端上登录的用户”的名称。因此,当没有控制终端时,例如在mod_python应用程序中,它失败。
Vebjorn Ljosa 09年

23
Windows不可用
Walker Hale IV

3
如果使用su,则不会返回当前用户,而是最初登录的用户。
Trevor Allred 2014年

4
确实可以在Windows上运行... Python 3.4.1(v3.4.1:c0e311e010fc,2014年5月18日,10:38:22)[win32 MSC v.1600 32 bit(Intel)]键入“ help”,“ copyright”,有关更多信息的“信用”或“许可证”。>>>导入操作系统;os.getlogin()'jrb'–
Naib

5
仅适用于Windows for Python3.x。
Zitrax 2015年

70

您可能可以使用:

os.environ.get('USERNAME')

要么

os.environ.get('USER')

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


18
os.getenv(...)不推荐使用os.environ[...]
Mike Graham

11
它不应该是USER而不是USERNAME吗?
Karl Bartel 2012年

7
@MikeGraham os.getenv似乎没有被弃用..?
2012年

4
是的,正是USER vs USERNAME正是不可移植的,因此它无法提供正确的答案。
彼得M,

2
USERNAME适用于Windows,USER适用于Linux
Sabrina

22

这些可能有效。我不知道它们作为服务运行时的行为。他们是不可移植的,但是这就是os.nameif语句是。

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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


30
这个答案至少和(无用的)25票赞成的unix-only回答一样有用。
汤姆B

3
>“至少有用”。大概正确的答案是两者的结合。
乔纳森·哈特利2014年

如果您在Windows上受python 2困扰,这是唯一安全的方法。通过SET USERNAME=FAKE在python命令之前运行,可以欺骗所有其他方式
CodeKid

21

如果您需要此文件来获取用户的主目录,则可以将以下内容视为可移植的(至少是win32和linux),是标准库的一部分。

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

您也可以解析这样的字符串以仅获取最后的路径组件(即用户名)。

参见:os.path.expanduser


9
某人的主目录并不总是反映其用户名。
dreamlax

这在Linux和Windows上均可使用
Sabrina

不幸的是,如果您在Windows中设置HOME变量,它将返回该值。
GLRoman

15

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

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


16
这个解决方案很聪明,但是做出了一些并不总是正确的假设。在Linux上,没有要求用户名出现在homedir路径中的约束。多数情况下只是这种情况,但是sysadmin可以将用户的homedir设置为他们想要的任何内容。
Joe Holloway 2014年

设置HOME变量可以克服这一点。
GLRoman

11

结合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()

9

至少对于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中的某些应用程序中使用“域/用户”可能会有所帮助。


1
domain/usergroup/user
窗口

4
命令模块在Windows上不起作用。这是UNIX特定的模块(请参阅docs.python.org/2/library/commands.html)。现在已弃用,建议使用子流程。 user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems

k; 然后使用子流程... jeez
dylnmc

2条评论。即使在以不同用户名运行的服务的上下文中,commands.whoami也表现出色。即与 chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid 一无所获。其次,user = subprocess.check_output("whoami").strip() 它比上面的替换换行符更具便携性。commandsVS subprocess似乎挑剔,但命令是从Python 3的缺失
JL Peyret

5

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

用法:

import plx

username = plx.get_username()

(在Windows上需要win32扩展名)


4

仅使用标准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"])()

1
getpass也是一个标准库
jodag

在win10 python3.7.4中对我不起作用。我抱怨在环境变量中找不到“ USER”。我想无论如何getpass是一个更好的选择。
里卡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.