什么是获取当前用户的用户名的可移植方法(例如Linux和Windows) ?类似于os.getuid()的东西会很好:
>>> os.getuid()
42
# Does not currently exist in Python
>>> os.getusername()
'slartibartfast'
pwd模块仅适用于Unix。有些人认为,在某些情况下,在Windows下获取用户名可能会很复杂(例如,作为Windows服务运行)。
什么是获取当前用户的用户名的可移植方法(例如Linux和Windows) ?类似于os.getuid()的东西会很好:
>>> os.getuid()
42
# Does not currently exist in Python
>>> os.getusername()
'slartibartfast'
pwd模块仅适用于Unix。有些人认为,在某些情况下,在Windows下获取用户名可能会很复杂(例如,作为Windows服务运行)。
当前回答
对我来说,使用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 用户名:根
不需要安装任何模块或扩展。
其他回答
我在一段时间前写了plx模块,以便在Unix和Windows上以可移植的方式获取用户名(以及其他东西): http://www.decalage.info/en/python/plx
用法:
import plx
username = plx.get_username()
(在Windows上需要win32扩展)
Psutil提供了一种可移植的方法,它不像getpass解决方案那样使用环境变量。它不太容易出现安全问题,应该是目前公认的答案。
import psutil
def get_username():
return psutil.Process().username()
在底层,它结合了unix的基于getpuid的方法和Windows的GetTokenInformation方法。
以上方法在我的案例中都不起作用(向下滚动到实际的解决方案)。 我得到的所有解决方案的问题是错误的用户名时运行命令与sudo:
psutil soulution:
$ 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!
操作系统。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!
操作系统。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 python3情况下,切换SUDO_USER和USER会给出错误的结果。
实际解决方案(不可移植)
解决方案有点棘手,依赖于默认的根主目录位置,但适用于所有情况:
$ 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!
你还可以使用:
os.getlogin()
至少对于UNIX,这是可行的……
import commands
username = commands.getoutput("echo $(whoami)")
print username
编辑: 我刚刚查了一下,这在Windows和UNIX上都适用:
import commands
username = commands.getoutput("whoami")
在UNIX上,它返回用户名,但在Windows上,它返回用户组,斜杠,用户名。
--
I.E.
UNIX返回:"username"
Windows返回:"domain/username"
--
这很有趣,但可能并不理想,除非你在终端上做一些事情……在这种情况下,您可能会使用os。首先是系统。例如,一段时间前,我需要将我的用户添加到一个组,所以我这样做了(注意,这是在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中的某些应用程序中使用“域/用户”可能会有所帮助。