是否有可移植的方式来获取Python中的当前用户名?

时间:2009-05-08 22:20:20

标签: python portability username

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

一样工作
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'

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

15 个答案:

答案 0 :(得分:736)

查看getpass模块

import getpass
getpass.getuser()
'kostya'

可用性:Unix,Windows


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

答案 1 :(得分:99)

最好的办法是将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

答案 2 :(得分:74)

您也可以使用:

 os.getlogin()

答案 3 :(得分:59)

您可以使用:

os.environ.get('USERNAME')

os.environ.get('USER')

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

答案 4 :(得分:20)

这些可能有用。我不知道他们作为服务运行时的行为方式。它们不是可移植的,但这就是“os.name”和“if”语句的用途。

win32api.GetUserName()

win32api.GetUserNameEx(...)

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

答案 5 :(得分:18)

如果你需要这个来获得用户的家庭目录,下面可以被认为是便携式的(至少是win32和linux),是标准库的一部分。

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

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

请参阅:os.path.expanduser

答案 6 :(得分: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

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

答案 7 :(得分: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()

答案 8 :(得分:8)

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

答案 9 :(得分:5)

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

用法:

import plx

username = plx.get_username()

(它需要Windows上的win32扩展名)

答案 10 :(得分:3)

您可以通过Windows API获取Windows上的当前用户名,虽然通过ctypes FFI调用有点麻烦(GetCurrentProcessOpenProcessTokenGetTokenInformation→{{ 3}})。

我写了一个小模块,可以直接从Python LookupAccountSid完成。用法:

import getuser
print(getuser.lookup_username())

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

答案 11 :(得分:2)

以上在我的情况下都不起作用(向下滚动到实际解决方案)。
我在所有解决方案中遇到的问题是使用 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!

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

import psutil

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

在后台,这结合了基于Unix的getpwuid方法和Windows的GetTokenInformation方法。

答案 14 :(得分:-2)

获取当前用户名的最简单方法肯定是 username

pip install username

然后:

import username

print(username())
# your_username
  

可在Linux,macOS和Windows上运行