对于新的linux用户,用python获取登录名的简单方法是什么?

对于新的linux用户,用python获取登录名的简单方法是什么?,python,linux,ubuntu,operating-system,Python,Linux,Ubuntu,Operating System,我在覆盆子Pi3B上使用UbuntuMate。有没有一种简单的方法来做类似的事情: import os name = os.getlogin() print(name) (从窗口)?当我尝试在linux上使用此选项时,出现以下错误: Traceback (most recent call last): File "(this is a less than sign)pyshell#3(this is a greater than sign)", line 1, in <module

我在覆盆子Pi3B上使用UbuntuMate。有没有一种简单的方法来做类似的事情:

import os
name = os.getlogin()
print(name)
(从窗口)?当我尝试在linux上使用此选项时,出现以下错误:

Traceback (most recent call last):

  File "(this is a less than sign)pyshell#3(this is a greater than sign)", line 1, in <module>

print(os.getlogin())
OSError: [Errno 25] Inappropriate ioctl for device
回溯(最近一次呼叫最后一次):
文件“(这是小于号)pyshell#3(这是大于号)”,第1行,在
打印(os.getlogin())
OSError:[Errno 25]设备的ioctl不正确

您需要定义什么是“登录名”(以及为什么需要它)。在细节上,它并没有那么简单(我也不确定你是否完全理解它,即使是在Windows上,我也不知道)。请注意,文档中说明了如何使用(请在、、、中阅读有关这些的更多信息),在某些情况下(例如,作业、通过ssh启动的远程命令等),您没有

您可以使用一些环境变量。请参阅和(可能会找到它的Python等价物)。在大多数情况下(在某些交互式会话中),
USER
LOGNAME
环境变量都会给您一些“登录名”。在病理病例中,它们可能缺失或不同(或者不正确,想想程序)。Python有

然后,读一读。然后您就知道每个进程都有自己的uid(请参见和
geteuid
)。这是一个数字(Windows上的一个可能等价物是)。在Python中,从这个数字可以得到一个“登录名”

在非常罕见的病理情况下,您甚至可能有一个进程的某个uid没有“登录名”(例如,在您从
/etc/passwd
中删除的uid中运行的旧进程可能会出现这种情况,请参阅)

在病理情况下,
USER
&
LOGNAME
环境变量和
getuid
/
geteuid
后跟
getpuid
可能会给出不同的“登录名”,然后你必须决定想要哪个(这相当于准确定义“登录名”对你意味着什么)

您应该阅读本文以了解更多关于Linux编程的知识,并将从中获得的知识(ALP从C API的角度解释事情)应用到Python中

如果需要,通常的做法是使用
HOME
环境变量(但同样,您可能有未设置或错误的病理情况;在这种罕见的情况下,您需要定义您真正想要的)

另外,在Unix系统上,我不明白为什么您通常需要登录名。常用的习语是用逻辑推理

os.environ
是一个字典,其中包含各种类型的环境变量。这里的
USERNAME
LOGNAME
USER
等是系统状态环境变量。因此,根据操作系统和当前用户的类型,我们可以找到这些环境变量。 当我们在
Ubuntu
中以普通用户身份登录时,系统状态环境变量中有所有
USERNAME
LOGNAME
user
,但当我们以
root
用户身份登录时,系统状态环境变量中有
user
LOGNAME
。 请在
Ubuntu
中为普通用户查看以下代码


幸运的是,这里的文档很有用:“在大多数情况下,使用getpass.getuser()…”请回答您的问题,解释为什么需要登录名。我闻起来像是一种味道。我不明白什么样的应用程序真正需要这样一个名称(在Unix上,
uid
是一种更自然的思维方式),如果没有动机,您的问题就不清楚了。您没有定义什么是登录名以及为什么需要它。如果您的程序找不到登录名,该怎么办?或者如果它发现了不同的答案(参见)?最好在回答中提供一些英语解释谢谢@BasileStarynkevitch,继续下去,我一定会遵循它。现在,根据你的建议,我编辑了我的答案。
import os
# From os.environ, you can read USERNAME and LOGNAME 
os.environ['USERNAME']
os.environ['LOGNAME']