1. 程式人生 > >Python獲取本機所有IP地址

Python獲取本機所有IP地址

眾所周知,Python標準庫socket中有可以獲取本機IPV4地址的方法,下面是網上非常常見的一種用法:

>>> import socket
>>> hostname = socket.gethostname()
>>> hostname
'DESKTOP-I734J3O'
>>> socket.gethostbyname(hostname)
'192.168.0.103'

上面的程式碼在Windows下執行良好,但是無意中發現在Mac系統下執行不正常,返回的是本機迴環地址127.0.0.1,而不是真正的IP地址。經過查閱大量資料,終於發現socket模組中另一個函式的妙用,那就是getaddrinfo()函式,該函式用法為getaddrinfo(host, port, family=0, type=0, proto=0, flags=0),返回值是一個五元組的列表,該五元組形式為(family,

type, proto, canonname, sockaddr),其中最後一個元素sockaddr對於IPV4協議是(IP address, port)形式的元組,而對於IPV6協議是(address, port, flow info, scope id)形式的元組,也就是說,不管是IPV4還是IPV6,上面的函式都可以正確地獲取IP地址。

於是,繼續上面的程式碼:

>>> addrs = socket.getaddrinfo(hostname,None)
>>> for item in addrs:
     print(item)

 
(<AddressFamily.AF_INET6: 23>, 0, 0, '', ('fe80::b976:b065:27d:3747%10', 0, 0, 10))
(<AddressFamily.AF_INET6: 23>, 0, 0, '', ('fe80::1456:951:2418:27cf%7', 0, 0, 7))
(<AddressFamily.AF_INET: 2>, 0, 0, '', ('192.168.0.103', 0))
(<AddressFamily.AF_INET6: 23>, 0, 0, '', ('2001:0:9d38:6ab8:1456:951:2418:27cf', 0, 0, 0))

如此便可以獲取本機所有IPV4和IPV6地址,如果只想獲取IPV4地址,再繼續執行下面的程式碼:

>>> [item[4][0] for item in addrs if ':' not in item[4][0]][0]
'192.168.0.103'

有關文章閱讀:

--------------我是分割線-------------

“Python小屋”公眾號近期主要活動:

1、贈書活動:詳情請進入公眾號以後通過選單“最新資源”===>“歷史文章分類表”進行檢視

2、Python師資培訓班:8月6日-12日,濟南,面向全國高校老師和企業朋友,通知詳見關於舉辦2017年暑期全國高校教師 “Python程式設計及應用”培訓班通知

,贈送Python教材2本、Python教學PPT超過1600頁,Python教學視訊140集,Python教學案例300個。補充說明:如果不需要安排住宿的話,5天學費2100元(含午餐)。