Python как узнать ip компьютера в локальной сети

Обновлено: 07.07.2024

Как найти локальные IP-адреса (например, 192.168.x.x или 10.0.x.x) на платформе Python независимо и с использованием только стандартной библиотеки?

Это не всегда будет работать (возвращает 127.0.0.1 на компьютерах с именем хоста в /etc/hosts в качестве 127.0.0.1 ), в качестве того, что показывает гимел, следует использовать паллиатив, вместо этого используйте socket.getfqdn() . Конечно, вашей машине нужно разрешаемое имя хоста.

Для Linux вы можете просто использовать check_output системной команды hostname -I следующим образом:

Это вариант ответа UnkwnTech - он предоставляет функцию get_local_addr() , которая возвращает IP-адрес первичной локальной сети хоста. Я публикую это, потому что это добавляет ряд вещей: поддержку ipv6, обработку ошибок, игнорирование адресов localhost / linklocal и использование адреса TESTNET (rfc5737) для подключения.

Это вернет вам IP-адрес в системе Ubuntu, а также MacOS. Вывод будет IP-адрес системы, как мой IP: 192.168.1.10.

Это будет работать на большинстве Linux-коробок:

Примечание: это не использует стандартную библиотеку, но довольно просто.

$ pip install pif

Этот ответ является моей личной попыткой решить проблему получения IP-адреса локальной сети, поскольку socket.gethostbyname(socket.gethostname()) также возвратил 127.0.0.1. Этот метод не требует подключения к Интернету только через локальную сеть. Код для Python 3.x, но может быть легко преобразован для 2.x. Использование UDP Broadcast:

Как псевдоним myip , он должен работать везде:

  • Корректно работает с Python 2.x, Python 3.x, современными и старыми дистрибутивами Linux, OSX / macOS и Windows для поиска текущего адреса IPv4.
  • Не вернет правильный результат для компьютеров с несколькими IP-адресами, IPv6, без настроенного IP-адреса или без доступа в Интернет.

То же, что и выше, но только код Python:

  • Это вызовет исключение, если IP-адрес не настроен.

Версия, которая также будет работать в локальных сетях без подключения к Интернету:

Использование socket.gethostbyname(socket.gethostname()) здесь не работало, потому что на одном из моих компьютеров был /etc/hosts с дублирующимися записями и ссылками на себя. socket.gethostbyname() возвращает только последнюю запись в /etc/hosts .

Это была моя первая попытка, которая отсеивает все адреса, начинающиеся с "127." :

Это работает с Python 2 и 3 в Linux и Windows, но не работает с несколькими сетевыми устройствами или IPv6. Однако на последних дистрибутивах Linux он перестал работать, поэтому я попробовал этот альтернативный метод. Он пытается подключиться к DNS-серверу Google по адресу 8.8.8.8 через порт 53 :

Затем я объединил две вышеупомянутые техники в одну строку, которая должна работать везде, и создал псевдоним myip и фрагмент Python в верхней части этого ответа.

С ростом популярности IPv6 и для серверов с несколькими сетевыми интерфейсами использование стороннего модуля Python для нахождения IP-адреса, вероятно, является одновременно более надежным и надежным, чем любой из перечисленных здесь методов.

Ну, вы можете использовать команду «ip route» в GNU / Linux, чтобы узнать ваш текущий IP-адрес.

Это показывает IP, данный интерфейсу сервером DHCP, работающим на маршрутизаторе / модеме. Обычно «192.168.1.1/24» - это IP-адрес для локальной сети, где «24» означает диапазон возможных IP-адресов, заданных сервером DHCP в пределах диапазона маски.

Вот пример: обратите внимание, что PyNotify является лишь дополнением, чтобы понять мою точку зрения и не требуется вообще

Преимущество этого в том, что вам не нужно указывать сетевой интерфейс. Это очень полезно при запуске сервера сокетов

Вы можете установить PyNotify, используя easy_install или даже Pip:

Или внутри скрипта / интерпретатора Python

На Debian (проверено) и я подозреваю, что большинство Linux ..

На MS Windows (проверено)

Я только что нашел это, но это кажется немного хакерским, однако, говорят, попробовал это на * nix, а я сделал на Windows, и это сработало.

Это предполагает, что у вас есть доступ в Интернет, и что нет локального прокси.

Я использую следующий модуль:

Протестировано с Windows и Linux (и не требует дополнительных модулей для них), предназначенных для использования в системах, которые находятся в одной локальной сети на основе IPv4.

Фиксированный список имен интерфейсов не работает для последних версий Linux, которые приняли изменение systemd v197, касающееся предсказуемых имен интерфейсов, на что указывает Александр. В таких случаях вам необходимо вручную заменить список именами интерфейсов в вашей системе или использовать другое решение, например netifaces.

Вариация на ответ ниндзягецко. Это должно работать в любой локальной сети, которая разрешает широковещательную рассылку UDP и не требует доступа к адресу в локальной сети или в Интернете.

Эй, ребята! Сегодня мы узнаем о модуле ipaddress в Python. Итак, без лишних слов, давайте начнем.

Эй, ребята! Сегодня мы узнаем о модуле ipaddress в Python. Итак, без лишних слов, давайте начнем.

Что такое IP-адрес?

IP расшифровывается как интернет-протокол. Он используется для идентификации узла в любой сети. Поэтому любое устройство, которое подключается к Интернету, должно иметь IP-адрес.

Существует две версии IP-адресов: IPv4 и IPv6. В настоящее время используется IPv4, в то время как IPv6 внедряется крупными сетевыми провайдерами медленно из-за нехватки адресов IPv4 по сравнению с устройствами в сети.

Чтобы узнать больше об IP-адресах, посетите страницу Wiki здесь .

Как использовать модуль ipaddress в Python?

Давайте начнем с использования модуля ipaddress прямо сейчас. Чтобы задать адрес хоста, мы используем ip-адрес.ip_address( ) .

Эта функция автоматически определяет, какая версия будет использоваться на основе переданных значений. Он либо возвращает адрес IPv4, либо адрес IPv6.

1. Как создать действительный IPv4-адрес?

IPv4 проверяет значения в диапазоне от 0 до 255. Целое число, которое помещается в 32 бита, представляет октет в адресе. Целое число, упакованное в байтовый объект длиной 4.

2. Как создать действительный IPv6-адрес?

IPv6 проверяет значения в диапазоне от 0 до ffff. Целое число, которое укладывается в 128 бит. Целое число, упакованное в байтовый объект длиной 16.

Работа с IP-адресами в Python с помощью модуля ipaddress

IP-адреса сопровождаются набором правил. Диапазонам IP-адресов назначаются различные функции.

Например, 127.0.0.1-это адрес обратной связи, назначенный сетевому модулю на вашем компьютере. Когда вы отправляете пинг-пакет на этот IP-адрес, вы, по сути, пингуете свой собственный компьютер.

1. Основные функции IP

Давайте посмотрим, как мы можем проверить, какие адреса являются петлевыми, многоадресными, локальными ссылками или зарезервированы с помощью модуля ipaddress в Python

2. Обратный поиск IP-адресов

Функция обратного указателя запрашивает DNS для разрешения IP-адреса, добавленного в качестве аргумента здесь. Если DNS сможет разрешить IP-адрес, вы получите вывод с назначенным именем.

Если вы пропингуете IP-адрес, назначенный доменному имени, вы, скорее всего, получите имя сервера, на котором существует домен. Однако это может измениться в зависимости от настройки брандмауэра.

Сеть IPv4 и сеть IPv6 могут помочь нам определить и проверить определения IP-сетей.

Мы можем получить IP-сеть в требуемом формате без написания пользовательского кода.

  1. Префикс/ обозначает количество битов высокого порядка, установленных в сетевой маске.
  2. 2. Маска сети-это IP-адрес с набором битов высокого порядка.
  3. 3. Маска хоста является логической обратной маской netmask и используется в списке управления доступом Cisco.

1. Проверьте, является ли IP-адрес IPv4 или IPv6

ip-адрес.функция ip_network( ) используется для возврата типа сети адреса. Он подтверждает, находится ли IP-адрес в сети IP4 или сети IP6.

2. Идентификация хостов в IP-сети

Хосты-это все IP-адреса, принадлежащие сети, за исключением сетевого адреса и широковещательного адреса сети.

host( ) возвращает итератор по используемым хостам в сети.

Сети, длина маски которых равна 31, сетевой адрес и широковещательный адрес сети также включены в результат, а сети, длина маски которых равна 32, возвращают список возвращаемых адресов одного хоста.

3. Определение широковещательного адреса для сетей

С помощью broadcast_address мы можем запросить DNS-сервер ответить широковещательным адресом в сети.

4. Определение перекрытий IP-сетей

Эта функция говорит нам, что если сеть частично или полностью содержится в другой сети. Он возвращает либо true, либо false.

5. Подсети в IP-сетях

Он возвращает итератор сетевых объектов. prefixlen_diff-это сумма длины префикса, которая должна быть увеличена, new_prefix-это новый префикс подсетей и больше нашего префикса.

6. Создание суперсетей с помощью модуля ipaddress

7. Проверьте, является ли IP-сеть суперсетью/подсетью другой IP-сети

Возвращает true, если сеть является подсетью другого, если сеть является суперсетью другого. Возвращает либо true, либо false.

8. Работа с объектами интерфейса IPv4

Объекты интерфейса можно использовать в качестве ключей в словарях, поскольку они хэшируются.

Интерфейс IPv4 наследует все атрибуты от адреса IPv4, поскольку интерфейс IPv4 является подклассом адреса IPv4.

Вот, 199.167.1.6 IP-адрес находится в сети 199.167.1.0/24

Мы можем представить сетевой интерфейс в префиксной нотации, как сетевую маску и как маску хоста.

Различные операции с IP-адресами

Вы можете проверить, как IP-адрес сравнивается с другим с помощью операторов сравнения в Python . Взгляните на приведенный ниже пример.

Мы можем добавлять или вычитать целые числа из объектов IP-адресов.

Адреса могут быть преобразованы в строки или целые числа с помощью встроенных функций ул( ) и int( ).

IPv6-адреса преобразуются в строки без идентификатора зоны.

Вывод

В этом уроке мы узнали об адресах IPv4 и IPv6, сети и интерфейсе. Для получения большего количества такого контента следите за обновлениями. Счастливого Обучения! 🙂

System.loadLibrary загружает DLL из пути JVM (путь к bin JDK).

Если вы хотите загрузить явный файл с помощью пути, используйте System.load ()

Это не будет работать всегда (возвращает 127.0.0.1 на машинах, имеющих имя хоста в /etc/hosts как 127.0.0.1 ), палиатив будет тем, что показывает gimel, вместо этого используйте socket.getfqdn() . Конечно, ваша машина нуждается в разрешимом имени хоста.

Следует отметить, что это не независимое от платформы решение. Многие Linuxes вернут 127.0.0.1 в качестве вашего IP-адреса, используя этот метод. – Jason Baker 3 October 2008 в 13:07 Кажется, он возвращает только один IP-адрес. Что делать, если машина имеет несколько адресов? – Jason R. Coombs 23 October 2009 в 15:39 По Ubuntu это возвращает 127.0.1.1 по какой-то причине. – slikts 20 March 2012 в 07:52 @UnkwnTech, пожалуйста, не принимайте ответ, это явно ненадежно. – Federico 7 January 2015 в 13:41

Примечание. Это не использует стандартную библиотеку, но довольно просто.

$ pip install pif

вопросы заключались в поиске IP-адреса с использованием stdlib – Chirila Alexandru 3 September 2013 в 14:09

Небольшое уточнение версии команд, использующей команду IP, и возвращает адреса IPv4 и IPv6:

В Debian (проверено), и я подозреваю, что большинство Linux ..

В MS Windows (проверено)

Вы можете использовать модуль netifaces . Просто введите:

в командной оболочке и он установит себя по умолчанию для установки на Python.

Затем вы можете использовать его следующим образом:

На моем компьютере он напечатан:

Автор этого модуля утверждает, что он должен работать в Windows, UNIX и Mac OS X.

Как указано в вопросе, я хочу что-то от установки по умолчанию, так как никаких дополнительных установок не требуется. – UnkwnTech 3 October 2008 в 13:52 Это был бы мой любимый ответ, за исключением того, что netifaces не поддерживает IPv6 в Windows и выглядит невосприимчивым. Кто-нибудь понял, как получить IPv6-адреса в Windows? – Jean-Paul Calderone 28 June 2011 в 13:57 netifaces не поддерживает py3k и требует компилятор C, который является PITA на окнах. – Matt Joiner 5 June 2012 в 07:43 @MattJoiner Ни одна из этих вещей не верна (последняя версия имеет двоичные файлы Windows на PyPI и поддерживает Py3K). – alastair 2 May 2014 в 16:42 @ Jean-PaulCalderone FWIW, последняя версия netifaces поддерживает IPv6 в Windows. – alastair 2 May 2014 в 16:43

Ну, вы можете использовать команду «ip route» в GNU / Linux, чтобы узнать ваш текущий IP-адрес.

Это показывает IP-адрес, предоставляемый интерфейсу сервером DHCP, работающим на маршрутизаторе / модемом. Обычно «192.168.1.1/24» - это IP для локальной сети, где «24» означает диапазон возможных IP-адресов, заданных сервером DHCP в пределах диапазона маски.

Вот пример: обратите внимание, что PyNotify является просто добавление, чтобы получить мою точку зрения и вообще не требуется

. Преимущество этого в том, что вам не нужно указывать сетевой интерфейс. Это очень полезно при запуске сервера сокетов

. Вы можете установить PyNotify с помощью easy_install или даже Pip:

или внутри скрипта python / интерпретатор

Вариант ответа ниндзягеко. Это должно работать в любой локальной сети, которая позволяет широковещательную рассылку UDP и не требует доступа к адресу в локальной сети или Интернете.

Если вы не хотите использовать внешние пакеты и не хотите полагаться на внешние интернет-серверы, это может помочь. Это код, который я нашел в Google Code Search и изменен для возврата требуемой информации:

Как полагается на windll , это будет работать только на Windows.

Однолинейное решение выше, как правило, работает на окнах. Это проблема Linux, которая является проблемой. – ricree 18 June 2009 в 01:19 +1 Этот метод по крайней мере пытается вернуть все адреса на машине. – Jason R. Coombs 23 October 2009 в 15:42 Этот скрипт выходит из строя на моем компьютере после возвращения первого адреса. Ошибка - это объект «AttributeError:« LP_IP_ADDR_STRING »не имеет атрибута« ipAddress »& quot; Я подозреваю, что это имеет какое-то отношение к IPv6-адресу. – Jason R. Coombs 23 October 2009 в 15:43 Оказывается, проблема в том, что для чего угодно, кроме первого IP-адреса, adNode не разыменовывается. Добавьте еще одну строку в пример в цикле while, и она работает для меня: adNode = adNode.contents – Jason R. Coombs 23 October 2009 в 17:09

Это вариант ответа UnkwnTech - он предоставляет функцию get_local_addr() , которая возвращает основной IP-адрес хоста. Я отправляю его, потому что это добавляет ряд вещей: поддержка ipv6, обработка ошибок, игнорирование localhost / linklocal addrs и использование TESTNET addr (rfc5737) для подключения.

Мне пришлось решить проблему «Поясните, является ли IP-адрес локальным или нет», и я сначала подумал о том, чтобы создать список IP-адресов, которые были локальными, а затем сопоставлены с ним. Вот что привело меня к этому вопросу. Тем не менее, я позже понял, что есть более прямой способ сделать это: попробуйте связать на этом IP-адресе и посмотреть, работает ли он.

Я знаю, что это не отвечает на вопрос напрямую, но это должен быть полезен любому, кто пытается решить соответствующий вопрос и кто следит за тем же путем. Преимущество этого кросс-платформенного решения (я думаю).

Это будет работать в большинстве linux-боксов:

FYI Я могу проверить, что метод:

Работает в OS X (10.6, 10.5), Windows XP и на хорошо управляемом сервере отдела RHEL. Он не работал на очень минимальной виртуальной виртуальной машине CentOS, и я просто делаю взлом ядра. Поэтому для этого экземпляра вы можете просто проверить адрес 127.0.0.1 и в этом случае сделать следующее:

И затем проанализировать ip-адрес с выхода. Следует отметить, что ifconfig по умолчанию не входит в обычный PATH пользователя, поэтому я даю полный путь в команде. Надеюсь, это поможет.

Один простой способ произвести «чистый» вывод через utils команд:

Он покажет все адреса IPv4 в системе.

Он не будет отображать все IPv4-адреса, потому что ifconfig сообщает только о первичных. Вам нужно использовать & quot; ip & quot; от iproute2, чтобы увидеть все адреса. – Helmut Grohne 9 April 2013 в 14:02 Это чертовски много оболочек для вопроса, требующего стандартную библиотеку . Кроме того, разбор ifconfig не является переносимым и даже не будет надежно работать на одной машине. – Dominik George 12 September 2017 в 07:42

Этот метод возвращает «первичный» IP-адрес в локальном поле (тот, у которого есть маршрут по умолчанию).

  • НЕ требуется маршрутизируемый сетевой доступ или любое соединение вообще.
  • Работает, даже если все интерфейсы отключены от сети.
  • НЕ нужно или даже пытаться получить в другом месте .
  • Работает с NAT, публичный, частный, внешний и внутренний IP
  • Pure Python 2 (или 3) без внешних зависимостей.
  • Работает в Linux, Windows и OSX.

Это возвращает единственный IP-адрес, который является основным (тот, у которого есть маршрут по умолчанию). Если вам нужно, все IP-адреса, привязанные ко всем интерфейсам (включая localhost и т. Д.), См. В этом ответе .

Обновлен вызов connect () по предложению Педро в комментариях. (Если вам нужна конкретная заявка на лицензию, это общедоступный домен / бесплатный для любого использования или MIT / CC2-BY-SA для кода / контента для стека переполнения по вашему выбору.)

Brilliant. Работает на Win7,8,8,1 + Linux Mint & amp; Arch, включая виртуальные машины. – shermy 3 March 2016 в 01:07 Работает в Windows 10 Pro! Спасибо, Джеймисон Беккер! – varantes 12 April 2017 в 14:02 По какой-то причине это не работает в Mac OS X El Capitan 10.11.6 (он генерирует ошибку ОС ОС: [Errno 49] Не может назначить запрошенный адрес). Изменение порта с '0' на '1': s.connect (('10.255.255.255', 1)) работал для меня как в Mac OS X, так и в Linux Ubuntu 17.04 – Pedro Scarapicchia Junior 15 April 2017 в 06:36 @PedroScarapicchiaJunior удивительное предложение, обновленный ответ. Благодаря!! – Jamieson Becker 17 April 2017 в 22:24

Я использую это на своих машинах ubuntu:

Это не работает.

Поэтому вы должны использовать & quot; / sbin / ifconfig & quot; как сказал гавалец. Он также работает на Red Hat 4.1.2-48. – Igor Ganapolsky 10 November 2010 в 18:05 Устаревший с 2.6. Используйте модуль subprocess для запуска команд. – Colin Dunklau 18 March 2013 в 23:06 И ifconfig также устарел. Используйте iproute2. – Helmut Grohne 9 April 2013 в 14:04 Получить все ips: import sh; [ip.split () [1] [5:] для ip в фильтре (lambda x: 'inet addr' в x, sh.ifconfig (). split ("\n"))] – Gabriel Littman 28 February 2014 в 00:43 Хм . на сервере с двумя сетевыми адаптерами это дает один назначенных IP-адресов, но повторяется три раза. На моем ноутбуке он дает «127.0.1.1» (повторяется три раза . ) . – bryn 20 November 2013 в 15:30

Метод Socket API

(Обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например 192.168 . он дает вам общедоступный IP-адрес, который может быть более желательным в зависимости от варианта использования.)

или использовать python2:

  • Одним из достоинств этого метода является кросс-платформенный
  • Он работает из-за уродливых NAT (например, вашего домашнего маршрутизатора).

Недостатки (и обходные пути):

Как я могу найти локальные IP-адреса (то есть 192.168.xx или 10.0.xx) на платформе Python независимо и используя только стандартную библиотеку?

Местный IP? Или публичный IP? Как вы собираетесь работать с системами с несколькими IP-адресами? использовать ifconfig -a и использовать вывод оттуда . @Fredrik Это плохая идея. Прежде всего, вы излишне разветвляете новый процесс, и это может помешать вашей программе работать в жестко заблокированных конфигурациях (или вам придется разрешить права, которые вашей программе не нужны). Во-вторых, вы будете вводить ошибки для пользователей разных локалей. В-третьих, если вы решили запустить новую программу вообще, вам не следует запускать устаревшую программу - ip addr она гораздо более удобна (и ее легче анализировать, загружать). @phihag Вы абсолютно правы, спасибо за исправление моей глупости Более фундаментальная проблема здесь заключается в том, что в правильно написанной современной сетевой программе правильный (набор) локальных IP-адресов зависит от однорангового узла или набора потенциальных одноранговых узлов. Если локальный IP-адрес необходим bind сокету для конкретного интерфейса, то это вопрос политики. Если локальный IP-адрес необходим для передачи его одноранговому узлу, чтобы одноранговый узел мог «перезвонить», т. Е. Чтобы открыть соединение с локальной машиной, тогда ситуация зависит от того, есть ли NAT (трансляция сетевых адресов) коробки между ними. Если нет NAT, getsockname это хороший выбор.

Это не всегда будет работать (возвращается 127.0.0.1 на машинах с именем хоста в виде /etc/hosts as 127.0.0.1 ), вместо того, чтобы показать gimel, следует использовать palitation socket.getfqdn() . Конечно, вашей машине нужно разрешаемое имя хоста.

Следует отметить, что это не платформо-независимое решение. Многие Linux вернут 127.0.0.1 в качестве вашего IP-адреса, используя этот метод. Похоже, это возвращает только один IP-адрес. Что делать, если у машины несколько адресов? В Ubuntu это возвращает 127.0.1.1 по некоторым причинам. @Jason R. Coombs, используйте следующий код для получения списка адресов IPv4, которые принадлежат хост-машине: socket.gethostbyname_ex(socket.gethostname())[-1]

Я только что нашел это, но это кажется немного хакерским, однако, говорят, попробовал это на * nix, а я сделал на Windows, и это сработало.

Это предполагает, что у вас есть доступ в Интернет, и что нет локального прокси.

Хорошей идеей может быть перехват исключений socket.error, которые могут быть вызваны s.connect ()! Было бы лучше использовать IP-адрес вместо доменного имени - он должен быть более быстрым и независимым от доступности DNS. Например, мы можем использовать 8.8.8.8 IP - общедоступный DNS-сервер Google. Очень умно, отлично работает. Вместо gmail или 8.8.8.8 вы также можете использовать IP-адрес или адрес сервера, с которого вы хотите видеть, если это применимо.

Этот метод возвращает «основной» IP-адрес локального ящика (тот, который имеет маршрут по умолчанию) .

  • НЕ нуждается в маршрутизируемом сетевом доступе или каком-либо соединении вообще.
  • Работает, даже если все интерфейсы отключены от сети.
  • НЕ нужно или даже пытаться добраться куда-нибудь еще .
  • Работает с NAT, публичными, частными, внешними и внутренними IP
  • Чистый Python 2 (или 3) без внешних зависимостей.
  • Работает на Linux, Windows и OSX.

Это возвращает единственный IP, который является основным (тот с маршрутом по умолчанию). Если вместо этого вам нужны все IP-адреса, подключенные ко всем интерфейсам (включая localhost и т. Д.), Посмотрите этот ответ .

Brilliant. Работает на Win7,8,8.1 + Linux Mint & Arch, включая виртуальные машины. Работает в Windows 10 Pro! Спасибо, Джеймисон Беккер! По некоторым причинам это не работает в Mac OS X El Capitan 10.11.6 (это генерирует исключительную ошибку ОС: [Errno 49] Невозможно назначить запрошенный адрес). Изменение порта с '0' на '1': s.connect (('10.255.255.255', 1)) работал для меня как в Mac OS X, так и в Linux Ubuntu 17.04 Это должен быть принятый ответ. socket.gethostbyname(socket.gethostname()) дает ужасные результаты.

Как называется псевдоним myip , это должно работать везде:

  • Корректно работает с Python 2.x, Python 3.x, современными и старыми дистрибутивами Linux, OSX / macOS и Windows для поиска текущего адреса IPv4.
  • Не вернет правильный результат для компьютеров с несколькими IP-адресами, IPv6, без настроенного IP-адреса или без доступа в Интернет.

То же, что и выше, но только код Python:

  • Это вызовет исключение, если IP-адрес не настроен.

Версия, которая также будет работать в локальных сетях без подключения к интернету:

Фон :

Использование socket.gethostbyname(socket.gethostname()) не сработало, потому что на одном из компьютеров, на котором я находился, были /etc/hosts повторяющиеся записи и ссылки на себя. socket.gethostbyname() возвращает только последнюю запись в /etc/hosts .

Это была моя первая попытка, которая отсеивает все адреса, начиная с "127." :

Это работает с Python 2 и 3 в Linux и Windows, но не работает с несколькими сетевыми устройствами или IPv6. Однако на последних дистрибутивах Linux он перестал работать, поэтому я попробовал этот альтернативный метод. Он пытается подключиться к DNS-серверу Google по 8.8.8.8 адресу 53 :

Затем я объединил две вышеупомянутые техники в одну строку, которая должна работать везде, и создал myip псевдоним и фрагмент Python в верхней части этого ответа.

С ростом популярности IPv6 и для серверов с несколькими сетевыми интерфейсами использование стороннего модуля Python для нахождения IP-адреса, вероятно, является одновременно более надежным и надежным, чем любой из перечисленных здесь методов.

@ Александр: Просто сказать, что этот ответ гораздо менее полезен, чем раньше (и это не так, как отфильтровывать дубликаты - большое дело;). Согласно документации socket.getaddrinfo() должно работать согласованно на всех платформах - но я проверял это только в Linux, не заботясь о других операционных системах. @ Александр, /etc/resolve.conf: No such file or directory и у меня есть локальный адрес IPv4, показанный ifconfig . Я могу подтвердить, что обновленная версия работает с Ubuntu 14.04 с Python2 и Py3k. «Обновление» показывает хороший трюк с connect () на UDP-сокете. Он не отправляет трафик, но позволяет найти адрес отправителя для пакетов указанному получателю. Порт, вероятно, не имеет значения (даже 0 должен работать). На многосетевом хосте важно выбрать адрес в правильной подсети. просто потому, что вы можете написать этот код в одной строке, это не значит, что вы должны .

Вы можете использовать модуль netifaces . Просто введите:

в командной оболочке, и он будет установлен по умолчанию при установке Python.

Тогда вы можете использовать это так:

На моем компьютере было напечатано:

Автор этого модуля утверждает, что он должен работать в Windows, UNIX и Mac OS X.

Как указано в вопросе, я хочу что-то из установки по умолчанию, так как никаких дополнительных установок не требуется. Это был бы мой любимый ответ, за исключением того, что netifaces не поддерживает IPv6 в Windows и выглядит не поддерживаемым. Кто-нибудь разобрался, как получить IPv6-адреса в Windows? netifaces не поддерживает py3k и требует компилятора C, который является PITA для окон. @MattJoiner Ничто из этого не соответствует действительности (последняя версия имеет бинарные файлы Windows для PyPI и поддерживает Py3K). @ Жан-PaulCalderone FWIW, последняя версия netifaces делает поддержку IPv6 на Windows.

Метод Socket API

Рефлекторный метод

(Обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например, 192.168 . ; он дает вам ваш публичный IP-адрес, который может быть более желательным в зависимости от варианта использования.)

или если используется python2:

  • Одним из достоинств этого метода является его кроссплатформенность
  • Это работает из-за уродливых NAT (например, ваш домашний маршрутизатор).

Недостатки (и обходные пути):

Читайте также: