Obtener la IP local y pública en Python

Publicado el 10 octubre 2022 por Daniel Rodríguez @analyticslane

Hace unos días publiqué una entrada en la explicaba los pasos para conseguir tanto la IP de nuestro ordenador en la red local como la pública con la que se accede a internet desde Matlab. Información que no se puede obtener directamente de las funciones estándar, pero es útil en múltiples ocasiones. Dado que en Python tampoco existe una función para obtener esta información, en esta ocasión voy a adaptar el código Matlab para poder obtener la IP local y pública en Python.

Obtener la IP local en Python

La IP local de un ordenador se puede obtener fácilmente en la línea de comandos. Aunque el comando para obtener esta información es diferente en Windows y los sistemas basados en UNIX (Linux y macOS). En el caso de Windows se puede obtener con escribiendo en la terminal

for /f "tokens=2 delims=[]" %a in ('ping -n 1 -4 "%computername%"') do @echo %a

mientras que en Linux y macOS el comando que se debe ejecutar sería

ifconfig | grep 'inet ' | grep -Fv 127.0.0.1 | awk '{print $2}'

En ambos casos la información se puede obtener usando la función getoutput() del módulo subprocess. Aunque es necesario identificar el sistema operativo sobre el que se está ejecutando el programa para seleccionar el comando adecuado. Para esto, el método más fiable es usar la función system() del módulo platform que devuelve la cadena 'Windows' para los sistemas Windows, 'Darwin' en macOS y 'Linux' al trabajar en un sistema basado en Linux. Así, cuando esta función devuelve la cadena 'Windows' deberemos ejecutar el primer comando y en caso contrario el segundo. Por ejemplo, se puede usar el siguiente código.

import platform
import subprocess

if platform.system() == 'Windows':
    local = subprocess.getoutput("""for /f "tokens=2 delims=[]" %a in ('ping -n 1 -4 "%computername%"') do @echo %a""")
else:
    local = subprocess.getoutput("ifconfig | grep 'inet ' | grep -Fv 127.0.0.1 | awk '{print $2}'")

print(local)

Obtener la IP pública en Python

Para obtener la IP una de las mejores opciones es solicitar la información a un servicio, como puede ser el caso de http://checkip.amazonaws.com. Al acceder a esta web se obtiene una página que solamente con la IP. Por lo que solamente hay que llamar a la página. Algo que en Python se puede obtener con la función get del módulo requests. Por lo que solamente hay que ejecutar la siguiente línea para obtener la información.

import requests

requests.get('http://checkip.amazonaws.com').text.strip()

Función para obtener ambas IP

Todo lo visto en las secciones anteriores se puede unir en una función para conseguir la IP local y pública en Python de una manera más sencilla. Una posible implementación puede ser la que se muestra a continuación

import platform
import requests
import subprocess

def get_ip():
    """IP local y publica
    
    Este comando permite obtener tanto la IP local como la pública con la que se está accediendo a la red
    
    Returns
    -------
    ip : (string, string)
        Una tupla con loa IP local y pública
    """
    try:
        if platform.system() == 'Windows':
            local = subprocess.getoutput("""for /f "tokens=2 delims=[]" %a in ('ping -n 1 -4 "%computername%"') do @echo %a""")
        else:
            local = subprocess.getoutput("ifconfig | grep 'inet ' | grep -Fv 127.0.0.1 | awk '{print $2}'")
    except:
        public = 'unknown'
        
    try:
        public = requests.get('http://checkip.amazonaws.com').text.strip()
    except:
        public = 'unknown'
        
    return (local, public)

donde la función devuelve la información en una tupla.

Conclusiones

En esta entrada se han visto los pasos para obtener la IP local y pública en Python, creando además una función que se con la que obtener la información de una manera sencilla.