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

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

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

有帮助吗?

解决方案

将getpass 模块

import getpass
getpass.getuser()
'kostya'

状况:Unix的,视窗


P.S。每下面的评论“的此功能着眼于各种环境变量来确定用户名的值。因此,这个功能不应该被用于访问控制的目的(也可能是其他任何目的依赖,因为它允许任何用户冒充任何其他)。

其他提示

您最好的选择将是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.environ.get('USER')

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

这些可能工作。我不知道作为一个服务运行时,他们的言行举止。他们不便携,但是这就是os.nameifstatements是。

win32api.GetUserName()

win32api.GetUserNameEx(...) 

请参阅: http://timgolden.me.uk/蟒/ win32_how_do_i / GET-的所有者对的一-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:\用户\为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,它返回用户的组,斜线,您的用户名。

-

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中。

您可以通过 Windows API 获取 Windows 上的当前用户名,尽管通过 ctypes FFI 调用有点麻烦(获取当前进程开放进程令牌获取Token信息查找AccountSid).

我写了一个小模块,可以直接从 Python 执行此操作, 获取用户.py. 。用法:

import getuser
print(getuser.lookup_username())

它可以在 Windows 和 *nix 上运行(后者使用 pwd 其他答案中描述的模块)。

仅使用标准Python库:

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

作品在Windows或Linux

另外,也可以删除一个符合立即调用:

from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top