今天碰到這個問題,用Python獲得本地IP地址,首先想到用socket.gethostbyname,代碼如下: 程序代碼: import socket ip = socket.gethostbyname(socket.gethostname()) print ip 可惜這樣并不完美,特別如果是ADSL撥號或者局域網(wǎng)上網(wǎng)會得到192.168.*.*這種內(nèi)部IP。 好像Linux下面可以用: 程序代碼: import socket 具體沒試過,我主要寫的是windows下面的應(yīng)用,只能另尋他法。import fcntl import struct def get_ip_address(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) print get_ip_address('lo') print get_ip_address('eth0') 找到一種windows和Linux下面通用的方法: 程序代碼: import re,urllib2 感覺有點山寨,訪問專門顯示自己IP的網(wǎng)站,然后采集它的內(nèi)容,用正則分析提取出IP地址的字符串。print re.search('\d+\.\d+\.\d+\.\d+',urllib2.urlopen("http://www.").read()).group(0) 這樣有個問題,如果訪問的網(wǎng)站掛掉了,這程序就失靈了。 完美解決方案: 程序代碼: import re,urllib2 用try嘗試第一個網(wǎng)站,如果掛掉了繼續(xù)嘗試第二個,如果第二個也掛掉了就嘗試第三個,總不能三個網(wǎng)站同時掛掉
class Getmyip: def getip(self): try: myip = self.visit("http://www.ip138.com/ip2city.asp") except: try: myip = self.visit("http://www./ip.phtml") except: try: myip = self.visit("http://www./") except: myip = "So sorry!!!" return myip def visit(self,url): opener = urllib2.urlopen(url) if url == opener.geturl(): str = opener.read() return re.search('\d+\.\d+\.\d+\.\d+',str).group(0) getmyip = Getmyip() localip = getmyip.getip() print localip |
|