Вам нужно загрузить свою библиотеку JNI.
System.loadLibrary загружает DLL из пути JVM (путь к bin JDK).
Если вы хотите загрузить явный файл с помощью пути, используйте System.load ()
См. также: Разница между System.load () и System.loadLibrary в Java
import socket
socket.gethostbyname(socket.gethostname())
Это не будет работать всегда (возвращает 127.0.0.1
на машинах, имеющих имя хоста в /etc/hosts
как 127.0.0.1
), палиатив будет тем, что показывает gimel, вместо этого используйте socket.getfqdn()
. Конечно, ваша машина нуждается в разрешимом имени хоста.
Примечание. Это не использует стандартную библиотеку, но довольно просто.
$ pip install pif
from pif import get_public_ip
get_public_ip()
Небольшое уточнение версии команд, использующей команду IP, и возвращает адреса IPv4 и IPv6:
import commands,re,socket
#A generator that returns stripped lines of output from "ip address show"
iplines=(line.strip() for line in commands.getoutput("ip address show").split('\n'))
#Turn that into a list of IPv4 and IPv6 address/mask strings
addresses1=reduce(lambda a,v:a+v,(re.findall(r"inet ([\d.]+/\d+)",line)+re.findall(r"inet6 ([\:\da-f]+/\d+)",line) for line in iplines))
#addresses1 now looks like ['127.0.0.1/8', '::1/128', '10.160.114.60/23', 'fe80::1031:3fff:fe00:6dce/64']
#Get a list of IPv4 addresses as (IPstring,subnetsize) tuples
ipv4s=[(ip,int(subnet)) for ip,subnet in (addr.split('/') for addr in addresses1 if '.' in addr)]
#ipv4s now looks like [('127.0.0.1', 8), ('10.160.114.60', 23)]
#Get IPv6 addresses
ipv6s=[(ip,int(subnet)) for ip,subnet in (addr.split('/') for addr in addresses1 if ':' in addr)]
В Debian (проверено), и я подозреваю, что большинство Linux ..
import commands
RetMyIP = commands.getoutput("hostname -I")
В MS Windows (проверено)
import socket
socket.gethostbyname(socket.gethostname())
Вы можете использовать модуль netifaces . Просто введите:
pip install netifaces
в командной оболочке и он установит себя по умолчанию для установки на Python.
Затем вы можете использовать его следующим образом:
from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
print '%s: %s' % (ifaceName, ', '.join(addresses))
На моем компьютере он напечатан:
{45639BDC-1050-46E0-9BE9-075C30DE1FBC}: 192.168.0.100 {D43A468B-F3AE-4BF9-9391-4863A4500583}: 10.5.9.207
Автор этого модуля утверждает, что он должен работать в Windows, UNIX и Mac OS X.
Ну, вы можете использовать команду «ip route» в GNU / Linux, чтобы узнать ваш текущий IP-адрес.
Это показывает IP-адрес, предоставляемый интерфейсу сервером DHCP, работающим на маршрутизаторе / модемом. Обычно «192.168.1.1/24» - это IP для локальной сети, где «24» означает диапазон возможных IP-адресов, заданных сервером DHCP в пределах диапазона маски.
Вот пример: обратите внимание, что PyNotify является просто добавление, чтобы получить мою точку зрения и вообще не требуется
#! /usr/bin/env python
import sys , pynotify
if sys.version_info[1] != 7:
raise RuntimeError('Python 2.7 And Above Only')
from subprocess import check_output # Available on Python 2.7+ | N/A
IP = check_output(['ip', 'route'])
Split_Result = IP.split()
# print Split_Result[2] # Remove "#" to enable
pynotify.init("image")
notify = pynotify.Notification("Ip", "Server Running At:" + Split_Result[2] , "/home/User/wireless.png")
notify.show()
. Преимущество этого в том, что вам не нужно указывать сетевой интерфейс. Это очень полезно при запуске сервера сокетов
. Вы можете установить PyNotify с помощью easy_install или даже Pip:
easy_install py-notify
или
pip install py-notify
или внутри скрипта python / интерпретатор
from pip import main
main(['install', 'py-notify'])
Вариант ответа ниндзягеко. Это должно работать в любой локальной сети, которая позволяет широковещательную рассылку UDP и не требует доступа к адресу в локальной сети или Интернете.
import socket
def getNetworkIp():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.connect(('<broadcast>', 0))
return s.getsockname()[0]
print (getNetworkIp())
Если вы не хотите использовать внешние пакеты и не хотите полагаться на внешние интернет-серверы, это может помочь. Это код, который я нашел в Google Code Search и изменен для возврата требуемой информации:
def getIPAddresses():
from ctypes import Structure, windll, sizeof
from ctypes import POINTER, byref
from ctypes import c_ulong, c_uint, c_ubyte, c_char
MAX_ADAPTER_DESCRIPTION_LENGTH = 128
MAX_ADAPTER_NAME_LENGTH = 256
MAX_ADAPTER_ADDRESS_LENGTH = 8
class IP_ADDR_STRING(Structure):
pass
LP_IP_ADDR_STRING = POINTER(IP_ADDR_STRING)
IP_ADDR_STRING._fields_ = [
("next", LP_IP_ADDR_STRING),
("ipAddress", c_char * 16),
("ipMask", c_char * 16),
("context", c_ulong)]
class IP_ADAPTER_INFO (Structure):
pass
LP_IP_ADAPTER_INFO = POINTER(IP_ADAPTER_INFO)
IP_ADAPTER_INFO._fields_ = [
("next", LP_IP_ADAPTER_INFO),
("comboIndex", c_ulong),
("adapterName", c_char * (MAX_ADAPTER_NAME_LENGTH + 4)),
("description", c_char * (MAX_ADAPTER_DESCRIPTION_LENGTH + 4)),
("addressLength", c_uint),
("address", c_ubyte * MAX_ADAPTER_ADDRESS_LENGTH),
("index", c_ulong),
("type", c_uint),
("dhcpEnabled", c_uint),
("currentIpAddress", LP_IP_ADDR_STRING),
("ipAddressList", IP_ADDR_STRING),
("gatewayList", IP_ADDR_STRING),
("dhcpServer", IP_ADDR_STRING),
("haveWins", c_uint),
("primaryWinsServer", IP_ADDR_STRING),
("secondaryWinsServer", IP_ADDR_STRING),
("leaseObtained", c_ulong),
("leaseExpires", c_ulong)]
GetAdaptersInfo = windll.iphlpapi.GetAdaptersInfo
GetAdaptersInfo.restype = c_ulong
GetAdaptersInfo.argtypes = [LP_IP_ADAPTER_INFO, POINTER(c_ulong)]
adapterList = (IP_ADAPTER_INFO * 10)()
buflen = c_ulong(sizeof(adapterList))
rc = GetAdaptersInfo(byref(adapterList[0]), byref(buflen))
if rc == 0:
for a in adapterList:
adNode = a.ipAddressList
while True:
ipAddr = adNode.ipAddress
if ipAddr:
yield ipAddr
adNode = adNode.next
if not adNode:
break
Использование:
>>> for addr in getIPAddresses():
>>> print addr
192.168.0.100
10.5.9.207
Как полагается на windll
, это будет работать только на Windows.
Это вариант ответа UnkwnTech - он предоставляет функцию get_local_addr()
, которая возвращает основной IP-адрес хоста. Я отправляю его, потому что это добавляет ряд вещей: поддержка ipv6, обработка ошибок, игнорирование localhost / linklocal addrs и использование TESTNET addr (rfc5737) для подключения.
# imports
import errno
import socket
# localhost prefixes
_local_networks = ("127.", "0:0:0:0:0:0:0:1")
# ignore these prefixes -- localhost, unspecified, and link-local
_ignored_networks = _local_networks + ("0.", "0:0:0:0:0:0:0:0", "169.254.", "fe80:")
def detect_family(addr):
if "." in addr:
assert ":" not in addr
return socket.AF_INET
elif ":" in addr:
return socket.AF_INET6
else:
raise ValueError("invalid ipv4/6 address: %r" % addr)
def expand_addr(addr):
"""convert address into canonical expanded form --
no leading zeroes in groups, and for ipv6: lowercase hex, no collapsed groups.
"""
family = detect_family(addr)
addr = socket.inet_ntop(family, socket.inet_pton(family, addr))
if "::" in addr:
count = 8-addr.count(":")
addr = addr.replace("::", (":0" * count) + ":")
if addr.startswith(":"):
addr = "0" + addr
return addr
def _get_local_addr(family, remote):
try:
s = socket.socket(family, socket.SOCK_DGRAM)
try:
s.connect((remote, 9))
return s.getsockname()[0]
finally:
s.close()
except socket.error:
return None
def get_local_addr(remote=None, ipv6=True):
"""get LAN address of host
:param remote:
return LAN address that host would use to access that specific remote address.
by default, returns address it would use to access the public internet.
:param ipv6:
by default, attempts to find an ipv6 address first.
if set to False, only checks ipv4.
:returns:
primary LAN address for host, or ``None`` if couldn't be determined.
"""
if remote:
family = detect_family(remote)
local = _get_local_addr(family, remote)
if not local:
return None
if family == socket.AF_INET6:
# expand zero groups so the startswith() test works.
local = expand_addr(local)
if local.startswith(_local_networks):
# border case where remote addr belongs to host
return local
else:
# NOTE: the two addresses used here are TESTNET addresses,
# which should never exist in the real world.
if ipv6:
local = _get_local_addr(socket.AF_INET6, "2001:db8::1234")
# expand zero groups so the startswith() test works.
if local:
local = expand_addr(local)
else:
local = None
if not local:
local = _get_local_addr(socket.AF_INET, "192.0.2.123")
if not local:
return None
if local.startswith(_ignored_networks):
return None
return local
Мне пришлось решить проблему «Поясните, является ли IP-адрес локальным или нет», и я сначала подумал о том, чтобы создать список IP-адресов, которые были локальными, а затем сопоставлены с ним. Вот что привело меня к этому вопросу. Тем не менее, я позже понял, что есть более прямой способ сделать это: попробуйте связать на этом IP-адресе и посмотреть, работает ли он.
_local_ip_cache = []
_nonlocal_ip_cache = []
def ip_islocal(ip):
if ip in _local_ip_cache:
return True
if ip in _nonlocal_ip_cache:
return False
s = socket.socket()
try:
try:
s.bind((ip, 0))
except socket.error, e:
if e.args[0] == errno.EADDRNOTAVAIL:
_nonlocal_ip_cache.append(ip)
return False
else:
raise
finally:
s.close()
_local_ip_cache.append(ip)
return True
Я знаю, что это не отвечает на вопрос напрямую, но это должен быть полезен любому, кто пытается решить соответствующий вопрос и кто следит за тем же путем. Преимущество этого кросс-платформенного решения (я думаю).
Это будет работать в большинстве linux-боксов:
import socket, subprocess, re
def get_ipv4_address():
"""
Returns IP address(es) of current machine.
:return:
"""
p = subprocess.Popen(["ifconfig"], stdout=subprocess.PIPE)
ifc_resp = p.communicate()
patt = re.compile(r'inet\s*\w*\S*:\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
resp = patt.findall(ifc_resp[0])
print resp
get_ipv4_address()
FYI Я могу проверить, что метод:
import socket
addr = socket.gethostbyname(socket.gethostname())
Работает в OS X (10.6, 10.5), Windows XP и на хорошо управляемом сервере отдела RHEL. Он не работал на очень минимальной виртуальной виртуальной машине CentOS, и я просто делаю взлом ядра. Поэтому для этого экземпляра вы можете просто проверить адрес 127.0.0.1 и в этом случае сделать следующее:
if addr == "127.0.0.1":
import commands
output = commands.getoutput("/sbin/ifconfig")
addr = parseaddress(output)
И затем проанализировать ip-адрес с выхода. Следует отметить, что ifconfig по умолчанию не входит в обычный PATH пользователя, поэтому я даю полный путь в команде. Надеюсь, это поможет.
Один простой способ произвести «чистый» вывод через utils команд:
import commands
ips = commands.getoutput("/sbin/ifconfig | grep -i \"inet\" | grep -iv \"inet6\" | " +
"awk {'print $2'} | sed -ne 's/addr\:/ /p'")
print ips
Он покажет все адреса IPv4 в системе.
Этот метод возвращает «первичный» IP-адрес в локальном поле (тот, у которого есть маршрут по умолчанию).
Python 2 или 3:
import socket
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# doesn't even have to be reachable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except:
IP = '127.0.0.1'
finally:
s.close()
return IP
Это возвращает единственный IP-адрес, который является основным (тот, у которого есть маршрут по умолчанию). Если вам нужно, все IP-адреса, привязанные ко всем интерфейсам (включая localhost и т. Д.), См. В этом ответе .
Если вы находитесь за брандмауэром NAT, например, у вашего Wi-Fi-бокса дома, это не покажет ваш общедоступный IP-адрес NAT, а вместо этого ваш частный IP-адрес NAT в локальной сети, который имеет маршрут по умолчанию к вашему локальному маршрутизатору WIFI; получение внешнего IP-адреса вашего Wi-Fi-маршрутизатора потребует либо запускать это на THAT-боксе, либо подключиться к внешней службе, такой как whatismyip.com/whatismyipaddress.com, которая может отражать IP-адрес ... но это полностью отличается от исходного вопроса. :)
Обновлен вызов connect () по предложению Педро в комментариях. (Если вам нужна конкретная заявка на лицензию, это общедоступный домен / бесплатный для любого использования или MIT / CC2-BY-SA для кода / контента для стека переполнения по вашему выбору.)
Боюсь, нет никаких хороших независимых для платформы способов сделать это, кроме как подключиться к другому компьютеру и отправить ему ваш IP-адрес. Например: findmyipaddress . Обратите внимание, что это не сработает, если вам нужен IP-адрес за NAT, если только компьютер, к которому вы подключаетесь, находится за NAT.
Вот одно из решений, которое работает в Linux: получить IP-адрес, связанный с сетевым интерфейсом .
Я использую это на своих машинах ubuntu:
import commands
commands.getoutput("/sbin/ifconfig").split("\n")[1].split()[1][5:]
Это не работает.
import socket
[i[4][0] for i in socket.getaddrinfo(socket.gethostname(), None)]
['fe80::34e8:fe19:1459:2cde%22','fe80::d528:99fb:d572:e289%12', '192.168.56.1', '192.168.1.2']
на рабочем столе Windows.
– Nakilon
19 July 2014 в 04:48
Метод Socket API
см. https://stackoverflow.com/a/28950776/711085
Недостатки:
Метод рефлектора
(Обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например 192.168 ..., он дает вам общедоступный IP-адрес, который может быть более желательным в зависимости от варианта использования.)
Вы можете запросить какой-то сайт, например whatismyip.com (но с API), например:
from urllib.request import urlopen
import re
def getPublicIp():
data = str(urlopen('http://checkip.dyndns.com/').read())
# data = '<html><head><title>Current IP Check</title></head><body>Current IP Address: 65.96.168.198</body></html>\r\n'
return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)
или использовать python2:
from urllib import urlopen
import re
def getPublicIp():
data = str(urlopen('http://checkip.dyndns.com/').read())
# data = '<html><head><title>Current IP Check</title></head><body>Current IP Address: 65.96.168.198</body></html>\r\n'
return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)
Преимущества:
Недостатки (и обходные пути):
изменить : Хотя изначально я думал, что эти методы были очень плохими (если вы не используете много резервных копий, код может быть неактуальным через много лет), он задает вопрос «что такое интернет?». Компьютер может иметь множество интерфейсов, указывающих на множество разных сетей. Для более подробного описания темы google для gateways and routes
. Компьютер может иметь доступ к внутренней сети через внутренний шлюз или получить доступ к всемирной сети через шлюз, например, для маршрутизатора (как правило, для случая). Локальный IP-адрес, о котором спрашивает OP, только четко определен в отношении одного уровня связи, поэтому вы должны указать, что («это сетевая карта или кабель Ethernet, о котором мы говорим?») , На этот вопрос может быть несколько неповторимых ответов. Однако глобальный IP-адрес во всемирной сети, вероятно, хорошо определен (в отсутствие массивной фрагментации сети): возможно, путь возврата через шлюз, который может получить доступ к TLD.
import socket
socket.gethostbyname(socket.getfqdn())
127.0.1.1
- ваш реальный IP-адрес. В более общем плане компьютер может иметь любое количество IP-адресов. Вы можете отфильтровать их для частных сетей - 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16.
Однако нет кросс-платформенного способа получить все IP-адреса. В Linux вы можете использовать SIOCGIFCONF
ioctl.
Чтобы получить ip-адрес, вы можете использовать команду shell непосредственно в python:
import socket, subprocess
def getIpAndHostname():
hostname = socket.gethostname()
shell_cmd = "ifconfig | awk '/inet addr/{print substr($2,6)}'"
proc = subprocess.Popen([shell_cmd], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
ip_list = out.split('\n')
ip = ip_list[0]
for _ip in ip_list:
try:
if _ip != "127.0.0.1" and _ip.split(".")[3] != "1":
ip = _ip
except:
pass
return ip, hostname
ip_addr, hostname = getIpAndHostname()
import netifaces as ni
ni.ifaddresses('eth0')
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
print(ip)
Это вернет вам IP-адрес в системе Ubuntu, а также MacOS. Результатом будет IP-адрес системы, как мой IP: 192.168.1.10.
im, используя следующий модуль:
#!/usr/bin/python
# module for getting the lan ip address of the computer
import os
import socket
if os.name != "nt":
import fcntl
import struct
def get_interface_ip(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', bytes(ifname[:15], 'utf-8'))
# Python 2.7: remove the second argument for the bytes call
)[20:24])
def get_lan_ip():
ip = socket.gethostbyname(socket.gethostname())
if ip.startswith("127.") and os.name != "nt":
interfaces = ["eth0","eth1","eth2","wlan0","wlan1","wifi0","ath0","ath1","ppp0"]
for ifname in interfaces:
try:
ip = get_interface_ip(ifname)
break;
except IOError:
pass
return ip
Протестировано с помощью окон и linux (и не требует дополнительных модулей для них), предназначенных для использования в системах, которые находятся в одной локальной сети на основе IPv4.
Фиксированный список имен интерфейсов не работает для последних версий Linux, которые приняли изменение systemd v197 относительно предсказуемых имен интерфейсов, как указано Alexander . В таких случаях вам нужно вручную заменить список именами интерфейса в вашей системе или использовать другое решение, например netifaces .
enp0s25
. Для получения дополнительной информации см. wiki.archlinux.org/index.php/Network_Configuration#Device_names
– Alexander
25 April 2014 в 12:54
struct.pack('256s', bytes(ifname[:15]))
– colminator
17 October 2015 в 18:57
В Linux:
>>> import socket, struct, fcntl
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sockfd = sock.fileno()
>>> SIOCGIFADDR = 0x8915
>>>
>>> def get_ip(iface = 'eth0'):
... ifreq = struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
... try:
... res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq)
... except:
... return None
... ip = struct.unpack('16sH2x4s8x', res)[2]
... return socket.inet_ntoa(ip)
...
>>> get_ip('eth0')
'10.80.40.234'
>>>
struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
следует заменить на struct.pack('16sH14s', iface.encode('utf-8'), socket.AF_INET, b'\x00'*14)
– pepoluan
3 January 2014 в 10:28
ioctl
- это устаревший интерфейс, который, как мне кажется, не поддерживает IPv6 и, вероятно, никогда не будет. Я думаю, что «Правильный» способ - через Netlink, который не очень прост в Python. Я думаю, что libc должен иметь функцию getifaddrs
, к которой можно получить доступ через модуль pythons ctypes
, который может работать - man7.org/linux/man-pages/man3/getifaddrs.3.html
– tMC
12 February 2014 в 17:37
netifaces доступен через pip и easy_install.
netifaces имеет некоторые странности на разных платформах:
Вот какой код netifaces для воспроизведения:
import netifaces
PROTO = netifaces.AF_INET # We want only IPv4, for now at least
# Get list of network interfaces
# Note: Can't filter for 'lo' here because Windows lacks it.
ifaces = netifaces.interfaces()
# Get all addresses (of all kinds) for each interface
if_addrs = [netifaces.ifaddresses(iface) for iface in ifaces]
# Filter for the desired address type
if_inet_addrs = [addr[PROTO] for addr in if_addrs if PROTO in addr]
iface_addrs = [s['addr'] for a in if_inet_addrs for s in a if 'addr' in s]
# Can filter for '127.0.0.1' here.
Вышеприведенный код не отображает адрес обратно в его имя интерфейса (полезно для генерации правил ebtables / iptables на лету). Итак, вот версия, которая хранит вышеуказанную информацию с именем интерфейса в кортеже:
import netifaces
PROTO = netifaces.AF_INET # We want only IPv4, for now at least
# Get list of network interfaces
ifaces = netifaces.interfaces()
# Get addresses for each interface
if_addrs = [(netifaces.ifaddresses(iface), iface) for iface in ifaces]
# Filter for only IPv4 addresses
if_inet_addrs = [(tup[0][PROTO], tup[1]) for tup in if_addrs if PROTO in tup[0]]
iface_addrs = [(s['addr'], tup[1]) for tup in if_inet_addrs for s in tup[0] if 'addr' in s]
И нет, я не влюблен в понимание списков. Это как раз то, как мой мозг работает в наши дни.
Следующий фрагмент распечатает все:
from __future__ import print_function # For 2.x folks
from pprint import pprint as pp
print('\nifaces = ', end='')
pp(ifaces)
print('\nif_addrs = ', end='')
pp(if_addrs)
print('\nif_inet_addrs = ', end='')
pp(if_inet_addrs)
print('\niface_addrs = ', end='')
pp(iface_addrs)
Наслаждайтесь!
Этот ответ - моя личная попытка решить проблему получения IP-адреса LAN, так как socket.gethostbyname(socket.gethostname())
также возвратил 127.0.0.1. Этот метод не требует Интернета только для подключения к локальной сети. Код для Python 3.x, но может быть легко преобразован для 2.x. Использование UDP Broadcast:
import select
import socket
import threading
from queue import Queue, Empty
def get_local_ip():
def udp_listening_server():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('<broadcast>', 8888))
s.setblocking(0)
while True:
result = select.select([s],[],[])
msg, address = result[0][0].recvfrom(1024)
msg = str(msg, 'UTF-8')
if msg == 'What is my LAN IP address?':
break
queue.put(address)
queue = Queue()
thread = threading.Thread(target=udp_listening_server)
thread.queue = queue
thread.start()
s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s2.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
waiting = True
while waiting:
s2.sendto(bytes('What is my LAN IP address?', 'UTF-8'), ('<broadcast>', 8888))
try:
address = queue.get(False)
except Empty:
pass
else:
waiting = False
return address[0]
if __name__ == '__main__':
print(get_local_ip())
Я только что нашел это, но кажется немного взломанным, однако они говорят, что попробовали его на * nix, и я сделал это на окнах, и это сработало.
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()
Предполагается, что у вас есть доступ в Интернет, и что нет локального прокси.