问题:有没有一种可移植的方法来获取Python中的当前用户名?
有没有一种可移植的方式来获取Python中当前用户的用户名(即,至少在Linux和Windows下都可以使用的用户名)。它会像这样工作os.getuid
:
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
我四处搜寻,很惊讶地没有找到一个明确的答案(尽管也许我只是在谷歌搜索方面很差)。该PWD模块提供了一个相对简单的方法来实现这一目标下,说,Linux的,但它不存在于Windows。一些搜索结果表明,在某些情况下(例如,作为Windows服务运行),在Windows下获取用户名可能会很复杂,尽管我尚未对此进行验证。
回答 0
看一下getpass模块
import getpass
getpass.getuser()
'kostya'
可用性:Unix,Windows
ps在下面的每个注释中:“ 此函数查看各种环境变量的值以确定用户名。因此,不应出于访问控制目的(或可能出于任何其他目的)依赖此函数,因为它允许任何用户模仿任何其他用户)。 “
回答 1
您最好的选择是与结合os.getuid()
使用pwd.getpwuid()
:
import os
import pwd
def get_username():
return pwd.getpwuid( os.getuid() )[ 0 ]
有关更多详细信息,请参阅pwd文档:
回答 2
您还可以使用:
os.getlogin()
回答 3
您可能可以使用:
os.environ.get('USERNAME')
要么
os.environ.get('USER')
但这不是安全的,因为可以更改环境变量。
回答 4
这些可能有效。我不知道它们作为服务运行时的行为。他们是不可移植的,但是这就是os.name
和if
语句是。
win32api.GetUserName()
win32api.GetUserNameEx(...)
参见:http : //timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
回答 5
如果您需要此文件来获取用户的主目录,则可以将以下内容视为可移植的(至少是win32和linux),是标准库的一部分。
>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'
您也可以解析这样的字符串以仅获取最后的路径组件(即用户名)。
回答 6
对我来说,使用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
结合pwd
和getpass
方法,基于其他答案:
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
至少对于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中的某些应用程序中使用“域/用户”可能会有所帮助。
回答 9
我前段时间编写了plx模块,以便以可移植的方式在Unix和Windows上获取用户名(以及其他功能):http : //www.decalage.info/zh-cn/python/plx
用法:
import plx
username = plx.get_username()
(在Windows上需要win32扩展名)
回答 10
仅使用标准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"])()
回答 11
您可以通过Windows API获得Windows上的当前用户名,尽管通过ctypes FFI(GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid)调用有点麻烦。
我编写了一个小模块,可以直接从Python进行此操作,即getuser.py。用法:
import getuser
print(getuser.lookup_username())
它可以在Windows和* nix上使用(后者使用pwd
其他答案中所述的模块)。