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

有没有一个可移植的方式来获取当前用户的用户名(例如,在Linux和Windows下,至少)。 它会像os.getuid一样os.getuid

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

我搜索了一下,很惊讶没有找到一个明确的答案(虽然也许我只是谷歌搜索不佳)。 pwd模块提供了一种比较简单的方法来实现这个目标,比如Linux,但是它不在Windows上。 一些搜索结果表明,在Windows下获取用户名可能在某些情况下变得复杂(例如,作为Windows服务运行),尽管我没有证实这一点。

看看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] 

输出:

视窗:

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

用户名:myuser

Linux的:

用户的家目录:/根

用户名:root

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

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

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

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

用法:

 import plx username = plx.get_username() 

(它需要Windows上的win32扩展)

虽然通过ctypes FFI( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid )调用有点麻烦,但可以通过Windows API获取当前的Windows用户名。

我写了一个小模块,可以直接从Python, getuser.py 。 用法:

 import getuser print(getuser.lookup_username()) 

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