На вопрос ниже частично дан ответ, см. Раздел Решение ниже.Так что я публикую это частично, чтобы помочь другим, а также, поскольку решение, которое у меня есть, еще не решило проблему.
Вопрос
Итак, вопрос в том, почему имя хоста, заданное следующими методами (с использованием платформы python и библиотек сокетов), дает разные имена хостов в зависимости от того, какой маршрутизатор вы используете.и почему оно также отличается от имени компьютера и имени локального хоста.Кстати, это очень специфично для Mac.
Во-первых, я использую модель MacBook Pro 2015 с High Sierra 10.13.6.Я использую терминал и делаю следующее:
import platform
platform.node()
Это дает мне что-то вроде '192-168-1-4.tpgi.com.au' в зависимости от IP-адреса, назначенного MacBook.Разные роутеры дают разные результаты.Я также получаю аналогичные результаты от
import socket
socket.gethostname()
, который снова возвращает что-то вроде '192-168-1-4.tpgi.com.au'.
Во-вторых, я подтверждаю статью, которая отвечает на аналогичный вопрос 4271740 / how-can-i-use-python-to-get-the-system-hostname
Однакоэта проблема немного отличается, в конце концов, насколько известно пользователю моего приложения, имя хоста должно быть тем, которое они могут видеть в своих системных настройках, что на самом деле отличается.Если я запускаю:
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, мне бы очень хотелось найти команду python для mac, которая могла бы найти имя компьютера, а не имя хоста.Так что если кто-нибудь знает чистый и устойчивый способ сделать это (я бы предпочел не запускать команду оболочки и анализировать ее вывод), я был бы очень благодарен!Было бы замечательно, если бы эта же команда (или функция) также работала на других типах ОС, таких как windows и linux, но я согласился, что это Mac, по крайней мере, насколько я могу судить.
Между тем, я надеюсь, что вышеупомянутое поможет, если кто-то еще столкнется с подобными проблемами:)
Спасибо!