有没有一种可移植的方法来获取Python中的当前用户名?
-
20-08-2019 - |
题
是否有一种可移植的方法可以在 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文档的更多细节:
您还可以使用:
os.getlogin()
您可以可能使用:
os.environ.get('USERNAME')
或
os.environ.get('USER')
但它不会是安全的,因为环境变量是可以改变的。
这些可能工作。我不知道作为一个服务运行时,他们的言行举止。他们不便携,但是这就是os.name
和if
statements是。
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
寻找最好的便携性:工作最好在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
没有必要安装任何模块或扩展。
组合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()
有关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中。
我写的PLX模块前段时间在Unix和Windows(除其他事项外),可移植的方式来获取用户名: http://www.decalage.info/en/python/plx
用法:
import plx
username = plx.get_username()
(它需要在Windows的win32扩展)
您可以通过 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"])()