有一种可移植的方式来获取当前的用户名在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文档以获取更多详细信息:
你也可以使用:
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
无需安装任何模块或扩展。
结合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上,它返回你的用户组,斜杠,你的用户名。
–
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
模块,如其他答案中所述)。