Jac*_*son 575 python portability username
是否有一种可移植的方式来获取Python中当前用户的用户名(即,至少在Linux和Windows下都能运行的用户名).它的工作方式如下os.getuid:
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
Run Code Online (Sandbox Code Playgroud)
我搜索了一下,并且惊讶地发现没有找到确定的答案(尽管我可能只是谷歌搜索不好).该PWD模块提供了一个相对简单的方法来实现这一目标下,说,Linux的,但它不存在于Windows.一些搜索结果表明,在Windows下获取用户名在某些情况下可能会很复杂(例如,作为Windows服务运行),尽管我还没有验证.
Kon*_*zin 787
看看getpass模块
import getpass
getpass.getuser()
'kostya'
Run Code Online (Sandbox Code Playgroud)
可用性:Unix,Windows
ps以下评论" 此函数查看各种环境变量的值以确定用户名.因此,不应依赖此函数用于访问控制目的(或可能是任何其他目的,因为它允许任何用户冒充任何其他用户). "
小智 104
您最好的选择是结合os.getuid()使用pwd.getpwuid():
import os
import pwd
def get_username():
return pwd.getpwuid( os.getuid() )[ 0 ]
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅pwd文档:
http://docs.python.org/library/pwd.html
小智 78
您还可以使用:
os.getlogin()
Run Code Online (Sandbox Code Playgroud)
Nad*_*mli 64
你可以使用:
os.environ.get('USERNAME')
Run Code Online (Sandbox Code Playgroud)
要么
os.environ.get('USER')
Run Code Online (Sandbox Code Playgroud)
但它不会安全,因为环境变量可以改变.
小智 21
这些可能有效.我不知道他们作为服务运行时的行为方式.它们不可移植,但这就是"os.name"和"if"语句的用途.
win32api.GetUserName()
win32api.GetUserNameEx(...)
请参阅:http: //timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
小智 20
如果你需要这个来获得用户的家庭目录,下面可以被认为是便携式的(至少是win32和linux),是标准库的一部分.
>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'
Run Code Online (Sandbox Code Playgroud)
您还可以解析此类字符串以仅获取最后一个路径组件(即用户名).
小智 16
对我来说,使用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]
Run Code Online (Sandbox Code Playgroud)
输出:
视窗:
用户的主页目录:C:\ Users\myuser
用户名:myuser
Linux的:
用户的主页目录:/ root
用户名:root
无需安装任何模块或扩展.
ana*_*nik 11
结合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()
Run Code Online (Sandbox Code Playgroud)
对于UNIX,至少,这有效......
import commands
username = commands.getoutput("echo $(whoami)")
print username
Run Code Online (Sandbox Code Playgroud)
编辑: 我只是查找它,这适用于Windows和UNIX:
import commands
username = commands.getoutput("whoami")
Run Code Online (Sandbox Code Playgroud)
在UNIX上,它返回您的用户名,但在Windows上,它会返回您的用户组,斜杠,您的用户名.
-
IE
UNIX返回:"username"
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"
Run Code Online (Sandbox Code Playgroud)
我觉得这样更容易阅读,你不必导入pwd或getpass.
我也觉得让"域/用户"在Windows中的某些应用程序中有所帮助.
psutil提供了一种可移植的方式,它不像getpass解决方案那样使用环境变量。它不太容易出现安全问题,现在应该是公认的答案。
import psutil
def get_username():
return psutil.Process().username()
Run Code Online (Sandbox Code Playgroud)
在幕后,这结合了getpwuid基于 unix 的GetTokenInformation方法和 Windows的方法。
仅使用标准 python 库:
from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()
Run Code Online (Sandbox Code Playgroud)
适用于 Windows(如果您在驱动器 C 上)、Mac 或 Linux
或者,您可以通过立即调用删除一行:
from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()
Run Code Online (Sandbox Code Playgroud)
小智 5
我不久前编写了plx模块,以便在Unix和Windows上以便携方式获取用户名(以及其他内容):http: //www.decalage.info/en/python/plx
用法:
import plx
username = plx.get_username()
Run Code Online (Sandbox Code Playgroud)
(它需要Windows上的win32扩展)
以上均不适用于我的情况(向下滚动到实际的解决方案)。
我在所有解决方案中遇到的问题是运行命令时的用户名错误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!
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
切换SUDO_USER并USER给出错误的结果以防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!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
337821 次 |
| 最近记录: |