如何在MacOS Sierra/High Sierra中使用Python获取用户设置的计算机名称

9
下面的问题已经部分得到了回答,请参见下面的解决方案部分。因此,我发布这篇文章不仅是为了帮助其他人,而且也因为我拥有的解决方案还没有真正解决问题。 问题 那么,问题是为什么以下技术(使用Python的平台和套接字库)给出的主机名会根据您连接的路由器不同而不同,而且与计算机名和本地主机名也不同。顺便说一下,这非常特定于Mac。首先,我使用一台2015年款的MacBook Pro,并运行High Sierra 10.13.6。我使用终端并执行以下操作:
import platform
platform.node()

这使我得到了类似于“192-168-1-4.tpgi.com.au”的东西,取决于分配给MacBook的IP地址。不同的路由器会给出不同的结果。 我还从中得到了类似的结果。
import socket
socket.gethostname()

其次,我注意到有一篇文章回答了一个类似的问题 4271740/how-can-i-use-python-to-get-the-system-hostname

然而,这个问题略有不同,因为就用户而言,他们应该在系统设置中看到主机名,但实际上这与所返回的主机名是不同的。如果我运行:

which returns again something like '192-168-1-4.tpgi.com.au'。

sudo scutil --get LocalHostName

我获取系统设置中的名称(在共享下方,其中混淆地显示了计算机名称和本地主机名,它们也可能不同)。本地主机名带有以下限定语句:

你本地网络上的计算机可以访问你的计算机: foo.local

所有这些都是问题的原因是我的应用程序使用主机名,而Mac上的主机名与本地主机名和计算机名称不同。然后,该主机名出现在我们的用户界面中,并且当以“192-168-1-4.tpgi.com.au”的形式出现时,对于识别用户计算机来说并不有帮助。用户最有可能期望看到他们的计算机名称,因为这是可见的。在Mac上,主机名不可见,可以使用命令设置或获取,但这不太可能是我们的用户在遇到此问题时自然想到的事情。

解决方案

所以问题涉及到Mac的开箱即用设置,我相信。可以通过在终端中使用以下命令查询Mac上的主机名:

hostname
192-168-1-4.tpgi.com.au

以下是我运行的查询结果,它将返回实际用于解析IP地址的主机名。正如我上面所提到的,这与计算机名称不匹配,使用我们的应用程序时可能会引起混淆。

sudo scutil --get HostName
HostName: not set

因此,我使用以下命令将主机名设置为机器上我认识的名称,如下所示:

sudo scutil --set HostName foo

现在,当我运行以下命令时,我得到了我和其他非技术用户希望看到的结果。
import socket
socket.gethostname()
foo

import platform
platform.node()
foo

最后,为了保险起见,我从终端运行了

hostname
foo

结论

好的,虽然我已经写了我找到了一个解决方案,但实际上并不是我需要的解决方案,问题在于我需要显示用户设置并识别的计算机名,而不是主机名。由于我正在使用python,我真的很想找到一个可以找到计算机名而不是主机名的mac python命令。因此,如果有人知道一种干净和可持续的方法来做到这一点(我希望不必运行shell命令并解析其输出),我会非常感激!如果同样的命令(或函数)也能运行在其他操作系统类型如Windows和Linux上,那就太好了,但我已经接受了这是一个mac的事情,至少据我所知。

与此同时,如果有人遇到类似的问题,我希望上面的内容能够帮助他们 :)

谢谢!

1个回答

1

我可以确认这个 bug,也可以证实解决方法,但需要注意的是它不会立即生效,无需重新启动,但 DNS 缓存需要过期(或被强制清除)才能完全生效。

我遇到了相同的问题,它影响任何非完全限定域名解析,不仅是本地机器名称。例如 nslookupping 看起来运行得很好,但只有 Python 中的 socket.getfqdn()socket.gethostbyname() 函数出现了故障。我的系统同时拥有 IPv4 和 IPv6 栈,这可能与该问题有关。

所以解决方法看起来是:

sudo scutil --set HostName `hostname`

为了使其正常工作,hostname 必须返回一个FQDN。

在我的情况下,它看起来像是 foo.lan,在这之后,Python开始能够解析诸如 foo.labbar.lan 这样的名称。

由于操作系统本地工具不受此影响,因此我最终创建了一个与MacOS相关的Python错误,因为我们不应该被迫使用上述解决方法使其工作。

https://bugs.python.org/issue35164 <-- 让我们在这里跟进。


嗨Sorin,感谢您的发布,我可以看到关于那个Python bug已经有了一些讨论。我同意您的观点,不能指望用户自己运行此命令。更重要的是,就我所记得的其他操作系统上从未出现过这种Python失败的情况,因此具有Mac特定的解决方法并不那么优雅。开发人员可能需要说服,因为他们关闭了我的bug,原因是“对我有效”。这并不是一个很好的结果,因为我仍然有这个问题。 - James Crowther

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接